一,存儲(chǔ)過程
優(yōu)點(diǎn):
1,減少網(wǎng)絡(luò)帶寬,按理論存儲(chǔ)過程會(huì)提高性能.
2,無需重新編譯,更改后即可運(yùn)行,無需重新編譯代碼
3,由專門的dba寫的sql語句更高效
4,安全性,(在傳輸用戶名密碼時(shí),可防止注入等情況)
缺點(diǎn):
1,依賴于數(shù)據(jù)庫廠商,難以移植(當(dāng)一個(gè)小系統(tǒng)發(fā)展到大系統(tǒng)時(shí),對(duì)數(shù)據(jù)庫的要求也會(huì)發(fā)生改變)
2,業(yè)務(wù)邏輯大的時(shí)候,封裝性不夠,難調(diào)試難以維護(hù)
3,復(fù)雜的應(yīng)用用存儲(chǔ)過程來實(shí)現(xiàn),就把業(yè)務(wù)處理的負(fù)擔(dān)壓在數(shù)據(jù)庫服務(wù)器上了。沒有辦法通過中間層來靈活分擔(dān)負(fù)載和壓力.均衡負(fù)載等
結(jié):
存儲(chǔ)過程用于進(jìn)行一些簡單的業(yè)務(wù)邏輯以及數(shù)據(jù)傳送會(huì)更好維護(hù),但是在復(fù)雜應(yīng)用時(shí),應(yīng)交于中間層服務(wù)器處理.所以合適的時(shí)候用著合理的操作.
------------
------------
存儲(chǔ)過程:
1.編譯后生成中間代碼,該代碼的執(zhí)行效率遠(yuǎn)比客戶端數(shù)據(jù)庫訪問快,但是大多數(shù)高級(jí)的數(shù)據(jù)庫系統(tǒng)都有statement cache的,所以編譯sql的花費(fèi)沒什么影響。但是執(zhí)行存儲(chǔ)過程要比直接執(zhí)行sql花費(fèi)更多(檢查權(quán)限等),所以對(duì)于很簡單的sql,存儲(chǔ)過程沒有什么優(yōu)勢(shì)。
2.使用的是服務(wù)器端游標(biāo),而客戶端程序使用的是客戶端游標(biāo),速度快
3.不需要象 J2EE 的程序那樣要部署,適當(dāng)?shù)臅r(shí)候只需在后臺(tái)更新,便于調(diào)試與維護(hù)
4.占用網(wǎng)絡(luò)流量較少,如果在存儲(chǔ)過程中沒有多次數(shù)據(jù)交互,那么實(shí)際上網(wǎng)絡(luò)傳輸量和直接sql是一樣的。
應(yīng)用層:
1.一般性的業(yè)務(wù)邏輯應(yīng)該放在中間層,這對(duì)軟件以后的技術(shù)擴(kuò)展有很多好處,像網(wǎng)格技術(shù),就是基于中間件技術(shù)的。
2、性能擴(kuò)展性問題:隨著系統(tǒng)訪問量的增長,系統(tǒng)必須進(jìn)行不斷地升級(jí)擴(kuò)展,特別對(duì)于大型系統(tǒng)而言,更重要的是性能可擴(kuò)展性而不是局部的性能。J2EE等多層結(jié)構(gòu)要解決的也是這方面的問題。處理邏輯如果全部放在存儲(chǔ)過程里,所有的處理都在數(shù)據(jù)庫服務(wù)器上進(jìn)行,消耗的就是數(shù)據(jù)庫服務(wù)器的CPU資源,大家知道數(shù)據(jù)庫服務(wù)器由于需要較高的可靠性,通常選用的都是價(jià)格昂貴的服務(wù)器,對(duì)數(shù)據(jù)庫服務(wù)器升級(jí)通常都花費(fèi)很大。如果把處理邏輯放在中間層服務(wù)器上進(jìn)行,中間層服務(wù)器一般都是小型的機(jī)器,價(jià)格便宜,而且中間層服務(wù)器的CPU通常主頻比數(shù)據(jù)庫服務(wù)器的速度還快(比如現(xiàn)在8CPU的數(shù)據(jù)庫服務(wù)器主頻只有800M,而雙CPU的刀片式服務(wù)器CPU主頻已經(jīng)到2.8G了),而且對(duì)于多層架構(gòu),支持中間層服務(wù)器可以增加多臺(tái)機(jī)器進(jìn)行負(fù)載均衡,用中間層服務(wù)器即價(jià)格便宜,擴(kuò)展空間也更大。
3、開發(fā)問題:存儲(chǔ)過程還是過程型語言,其重用性比不上JAVA等面向?qū)ο笳Z言開發(fā)。用JAVA開發(fā)的中間層服務(wù)可服用性更好(當(dāng)然,前提是你采用面向?qū)ο笤O(shè)計(jì))
4. 實(shí)際上這個(gè)只是要將訪問數(shù)據(jù)庫的接口統(tǒng)一,是用存儲(chǔ)過程,還是EJB,沒太大關(guān)系,也就是說,在三層結(jié)構(gòu)中,單獨(dú)設(shè)計(jì)出一個(gè)數(shù)據(jù)訪問層,同樣能實(shí)現(xiàn)這個(gè)目標(biāo)。
總結(jié):
1.存儲(chǔ)過程是基于計(jì)算密集型的業(yè)務(wù)邏輯。如果是基于操作密集型的就不要用存儲(chǔ)過程了
2.所有數(shù)據(jù)訪問在應(yīng)用層封裝為數(shù)據(jù)訪問層,在那里,如果SQL簡單的話,直接用SQL;如果SQL復(fù)雜,或者數(shù)據(jù)交互多且中間數(shù)據(jù)最后不會(huì)用到,使用存儲(chǔ)過程
3.(對(duì)于核心的算法,不變的東西放在前臺(tái)程序中。對(duì)于容易改變的字典數(shù)據(jù),接口邏輯和配置信息,可以放在后臺(tái)用存儲(chǔ)過程來完成。最大好處,也是最終目的是:源程序不改,只改后臺(tái)存儲(chǔ)過程就可以瀟灑應(yīng)付客戶需求的改變。)這個(gè)不知道對(duì)不對(duì)
|