好多年不做服務(wù)器項目了,最近幾個項目均和服務(wù)器有關(guān),出現(xiàn)很多性能相關(guān)問題,其中一個項目涉及到這么一個業(yè)務(wù),拿出來和大家分享下。
????業(yè)務(wù)大致為:刷身份證過檢,設(shè)備端生成一個過檢記錄id,需要把身份證文字信息和身份證圖片信息分別上傳到服務(wù)器S1和圖片服務(wù)器S2,其中服務(wù)器數(shù)據(jù)庫中身份證圖片信息保存的是身份證照片在圖片服務(wù)S2上的url。
????如果強制必須文本信息在服務(wù)器S1上傳成功后,再上傳身份證圖片,勢必會影響圖片上傳時間。如果不做這個強制限制,上傳圖片url和文字信息入庫時間先后就不能確定,url數(shù)據(jù)和文字信息在服務(wù)器數(shù)據(jù)庫中是執(zhí)行insert還是update就無法確定了,此時就必須處理insert失敗返再重新進行update操作,這個時候可以考慮使用存儲過程了。
????在使用存儲過程的問題上,和服務(wù)器端研發(fā)進行討論決定是否使用存儲過程,所以使用與否我們需要了解下存儲過程的優(yōu)缺點。
優(yōu)點:
1. 運行速度:對于很簡單的sql,存儲過程沒有什么優(yōu)勢。對于復(fù)雜的業(yè)務(wù)邏輯,因為在存儲過程創(chuàng)建的時候,數(shù)據(jù)庫已經(jīng)對其進行了一次解析和優(yōu)化。存儲過程一旦執(zhí)行,在內(nèi)存中就會保留一份這個存儲過程,這樣下次再執(zhí)行同樣的存儲過程時,可以從內(nèi)存中直接調(diào)用,所以執(zhí)行速度會比普通sql快。? ??
2. ?減少網(wǎng)絡(luò)傳輸:存儲過程直接就在數(shù)據(jù)庫服務(wù)器上跑,所有的數(shù)據(jù)訪問都在數(shù)據(jù)庫服務(wù)器內(nèi)部進行,不需要傳輸數(shù)據(jù)到其它服務(wù)器,所以會減少一定的網(wǎng)絡(luò)傳輸。
3. 可維護性:存儲過程有些時候比程序更容易維護,這是因為可以實時更新DB端的存儲過程。??有些bug,直接改存儲過程里的業(yè)務(wù)邏輯,而不用修改程序端代碼。?
4.?增強安全性:提高代碼安全,防止?SQL注入。這一點sql語句也可以做到。
5.?可擴展性:應(yīng)用程序和數(shù)據(jù)庫操作分開,獨立進行,而不是相互在一起。方便以后的擴展和DBA維護優(yōu)化。
缺點??:
1.?SQL本身是一種結(jié)構(gòu)化查詢語言,但不是面向?qū)ο蟮牡?,本質(zhì)上還是過程化的語言,面對復(fù)雜的業(yè)務(wù)邏輯,過程化的處理會很吃力。同時SQL擅長的是數(shù)據(jù)查詢而非業(yè)務(wù)邏輯的處理,如果如果把業(yè)務(wù)邏輯全放在存儲過程里面,違背了這一原則。
? 2.?如果需要對輸入存儲過程的參數(shù)進行更改,或者要更改由其返回的數(shù)據(jù),則您仍需要更新程序集中的代碼以添加參數(shù)、更新調(diào)用,等等,這時候估計會比較繁瑣了。
? 3.?開發(fā)調(diào)試復(fù)雜,由于IDE的問題,存儲過程的開發(fā)調(diào)試要比一般程序困難,不過這個對于有數(shù)據(jù)庫功底的研發(fā)來說調(diào)試不是問題。?????
? 4.?沒辦法應(yīng)用緩存。雖然有全局臨時表之類的方法可以做緩存,但同樣加重了數(shù)據(jù)庫的負擔(dān)。如果緩存并發(fā)嚴重,經(jīng)常要加鎖,那效率實在堪憂。
?5. 不支持群集,數(shù)據(jù)庫服務(wù)器無法水平擴展,或者數(shù)據(jù)庫的切割(水平或垂直切割)。數(shù)據(jù)庫切割之后,存儲過程并不清楚數(shù)據(jù)存儲在哪個數(shù)據(jù)庫中。
總結(jié):
?1. 適當(dāng)?shù)氖褂么鎯^程,能夠提高服務(wù)器性能。
? 2.?存儲過程不應(yīng)該大規(guī)模使用,DBA應(yīng)該在設(shè)計與維護數(shù)據(jù)庫時需要均衡考慮。
?3. 隨著眾多ORM?的出現(xiàn),存儲過程很多優(yōu)勢已經(jīng)不明顯。
????????4. 結(jié)合項目業(yè)務(wù)實際,從業(yè)務(wù)邏輯簡單的數(shù)據(jù)庫操作不建議使用存儲過程,復(fù)雜對數(shù)據(jù)實時性要求比較高,可以考慮從存儲過程觸發(fā)器上進行設(shè)計優(yōu)化。
? ? ?回到我們的這個項目業(yè)務(wù)上看。使用與否也需要結(jié)合客戶是否對身份證圖片信息實時性是否要求很高。最后與項目產(chǎn)品經(jīng)理確認,身份證圖片信息可延遲離線上傳,那么完全可以不使用存儲過程了。