課程
/后端開發(fā)
/Java
/Java高并發(fā)秒殺API之高并發(fā)優(yōu)化
您好,我看阿里規(guī)范里建議棄用存儲過程,然后面試的時候也說了存儲過程過時了,所以想請教下過時的原因,這里使用存儲過程所得到的優(yōu)化和產(chǎn)生的壞處相對比來說是否值得?
2018-06-08
源自:Java高并發(fā)秒殺API之高并發(fā)優(yōu)化 3-2
正在回答
優(yōu)點:
1.存儲過程只在創(chuàng)造時進(jìn)行編譯,以后每次執(zhí)行存儲過程都不需再重新編譯,而一般 SQL 語句每執(zhí)行一次就編譯一次,所以使用存儲過程可提高數(shù)據(jù)庫執(zhí)行速度。? 2.當(dāng)對數(shù)據(jù)庫進(jìn)行復(fù)雜操作時(如對多個表進(jìn)行 Update,Insert,Query,Delete 時),可將此復(fù)雜操作用存儲過程封裝起來與數(shù)據(jù)庫提供的事務(wù)處理結(jié)合一起使用。這些操作,如果用程序來完成,就變成了一條條的 SQL 語句,可能要多次連接數(shù)據(jù)庫。而換成存儲,只需要連接一次數(shù)據(jù)庫就可以了。? 3.存儲過程可以重復(fù)使用,可減少數(shù)據(jù)庫開發(fā)人員的工作量。? 4.安全性高,可設(shè)定只有某此用戶才具有對指定存儲過程的使用權(quán)。
缺點:
1.?? 運(yùn)行速度:?? 大多數(shù)高級的數(shù)據(jù)庫系統(tǒng)都有statement?? cache的,所以編譯sql的花費(fèi)沒什么影響。但是執(zhí)行存儲過程要比直接執(zhí)行sql花費(fèi)更多(檢查權(quán)限等),所以對于很簡單的sql,存儲過程沒有什么優(yōu)勢。?????? 2.?? 網(wǎng)絡(luò)負(fù)荷:如果在存儲過程中沒有多次數(shù)據(jù)交互,那么實際上網(wǎng)絡(luò)傳輸量和直接sql是一樣的。?????? 3.?? 團(tuán)隊開發(fā):很遺憾,比起成熟的IDE,沒有什么很好存儲過程的IDE工具來支持,也就是說,這些必須手工完成。?????? 4.?? 安全機(jī)制:對于傳統(tǒng)的C/S結(jié)構(gòu),連接數(shù)據(jù)庫的用戶可以不同,所以安全機(jī)制有用;但是在web的三層架構(gòu)中,數(shù)據(jù)庫用戶不是給用戶用的,所以基本上,只有一個用戶,擁有所有權(quán)限(最多還有一個開發(fā)用戶)。這個時候,安全機(jī)制有點多余。?????? 5.?? 用戶滿意:實際上這個只是要將訪問數(shù)據(jù)庫的接口統(tǒng)一,是用存儲過程,還是EJB,沒太大關(guān)系,也就是說,在三層結(jié)構(gòu)中,單獨設(shè)計出一個數(shù)據(jù)訪問層,同樣能實現(xiàn)這個目標(biāo)。?????? 6.?? 開發(fā)調(diào)試:一樣由于IDE的問題,存儲過程的開發(fā)調(diào)試要比一般程序困難(老版本DB2還只能用C寫存儲過程,更是一個災(zāi)難)。?????? 7.?? 移植性:算了,這個不用提,反正一般的應(yīng)用總是綁定某個數(shù)據(jù)庫的,不然就無法靠優(yōu)化數(shù)據(jù)庫訪問來提高性能了。?????? 8.?? 維護(hù)性:的確,存儲過程有些時候比程序容易維護(hù),這是因為可以實時更新DB端的存儲過程,但是在3層結(jié)構(gòu)下,更新server端的數(shù)據(jù)訪問層一樣能實現(xiàn)這個目標(biāo),可惜現(xiàn)在很多平臺不支持實時更新而已。?
慕絲9183733 提問者
qq_童年_1
存儲過程還是不行啊,我做壓力測試的時候,500個商品,用500個線程去搶,一半左右的線程會出現(xiàn)錯誤,不用存儲過程,只有20個左右的線程會出現(xiàn)錯誤。而且響應(yīng)速度也特別慢。不過redis緩存和行級鎖優(yōu)化是確實非常厲害,我用了學(xué)校實驗室的兩臺臺式機(jī)進(jìn)行部署和測試,mysql,redis,tomcat集中在一臺機(jī)器上,另一臺跑jmeter測試,同樣是500個線程500個商品,優(yōu)化前跑完需要13s,優(yōu)化后跑完需要7s,最大tps也提升了一倍
尋鹿
qq_人戲不分_0
舉報
Java實現(xiàn)高并發(fā)秒殺API的第四門課,小伙伴一定可以從中受益
2 回答使用存儲過程報錯
1 回答存儲過程適用性
1 回答存儲過程問題
3 回答存儲過程報錯
2 回答使用存儲過程的話Spring事務(wù)豈不是多余了?
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號-11 京公網(wǎng)安備11010802030151號
購課補(bǔ)貼聯(lián)系客服咨詢優(yōu)惠詳情
慕課網(wǎng)APP您的移動學(xué)習(xí)伙伴
掃描二維碼關(guān)注慕課網(wǎng)微信公眾號
2018-06-24
優(yōu)點:
1.存儲過程只在創(chuàng)造時進(jìn)行編譯,以后每次執(zhí)行存儲過程都不需再重新編譯,而一般 SQL 語句每執(zhí)行一次就編譯一次,所以使用存儲過程可提高數(shù)據(jù)庫執(zhí)行速度。
? 2.當(dāng)對數(shù)據(jù)庫進(jìn)行復(fù)雜操作時(如對多個表進(jìn)行 Update,Insert,Query,Delete 時),可將此復(fù)雜操作用存儲過程封裝起來與數(shù)據(jù)庫提供的事務(wù)處理結(jié)合一起使用。這些操作,如果用程序來完成,就變成了一條條的 SQL 語句,可能要多次連接數(shù)據(jù)庫。而換成存儲,只需要連接一次數(shù)據(jù)庫就可以了。
? 3.存儲過程可以重復(fù)使用,可減少數(shù)據(jù)庫開發(fā)人員的工作量。
? 4.安全性高,可設(shè)定只有某此用戶才具有對指定存儲過程的使用權(quán)。
缺點:
1.?? 運(yùn)行速度:?? 大多數(shù)高級的數(shù)據(jù)庫系統(tǒng)都有statement?? cache的,所以編譯sql的花費(fèi)沒什么影響。但是執(zhí)行存儲過程要比直接執(zhí)行sql花費(fèi)更多(檢查權(quán)限等),所以對于很簡單的sql,存儲過程沒有什么優(yōu)勢。?????
? 2.?? 網(wǎng)絡(luò)負(fù)荷:如果在存儲過程中沒有多次數(shù)據(jù)交互,那么實際上網(wǎng)絡(luò)傳輸量和直接sql是一樣的。?????
? 3.?? 團(tuán)隊開發(fā):很遺憾,比起成熟的IDE,沒有什么很好存儲過程的IDE工具來支持,也就是說,這些必須手工完成。?????
? 4.?? 安全機(jī)制:對于傳統(tǒng)的C/S結(jié)構(gòu),連接數(shù)據(jù)庫的用戶可以不同,所以安全機(jī)制有用;但是在web的三層架構(gòu)中,數(shù)據(jù)庫用戶不是給用戶用的,所以基本上,只有一個用戶,擁有所有權(quán)限(最多還有一個開發(fā)用戶)。這個時候,安全機(jī)制有點多余。?????
? 5.?? 用戶滿意:實際上這個只是要將訪問數(shù)據(jù)庫的接口統(tǒng)一,是用存儲過程,還是EJB,沒太大關(guān)系,也就是說,在三層結(jié)構(gòu)中,單獨設(shè)計出一個數(shù)據(jù)訪問層,同樣能實現(xiàn)這個目標(biāo)。?????
? 6.?? 開發(fā)調(diào)試:一樣由于IDE的問題,存儲過程的開發(fā)調(diào)試要比一般程序困難(老版本DB2還只能用C寫存儲過程,更是一個災(zāi)難)。?????
? 7.?? 移植性:算了,這個不用提,反正一般的應(yīng)用總是綁定某個數(shù)據(jù)庫的,不然就無法靠優(yōu)化數(shù)據(jù)庫訪問來提高性能了。?????
? 8.?? 維護(hù)性:的確,存儲過程有些時候比程序容易維護(hù),這是因為可以實時更新DB端的存儲過程,但是在3層結(jié)構(gòu)下,更新server端的數(shù)據(jù)訪問層一樣能實現(xiàn)這個目標(biāo),可惜現(xiàn)在很多平臺不支持實時更新而已。?
2018-08-17
存儲過程還是不行啊,我做壓力測試的時候,500個商品,用500個線程去搶,一半左右的線程會出現(xiàn)錯誤,不用存儲過程,只有20個左右的線程會出現(xiàn)錯誤。而且響應(yīng)速度也特別慢。不過redis緩存和行級鎖優(yōu)化是確實非常厲害,我用了學(xué)校實驗室的兩臺臺式機(jī)進(jìn)行部署和測試,mysql,redis,tomcat集中在一臺機(jī)器上,另一臺跑jmeter測試,同樣是500個線程500個商品,優(yōu)化前跑完需要13s,優(yōu)化后跑完需要7s,最大tps也提升了一倍