數(shù)據(jù)庫(kù)存儲(chǔ)過程的作用是什么 為什么阿里巴巴Java開發(fā)手冊(cè)里要求禁止使用存儲(chǔ)過程?
為什么阿里巴巴Java開發(fā)手冊(cè)里要求禁止使用存儲(chǔ)過程?存儲(chǔ)過程,最早的概念據(jù)我推斷是來自于Oracle,最早oracle是只有函數(shù)的概念,依稀記得是oracle8還是9才加的存儲(chǔ)過程package的概
為什么阿里巴巴Java開發(fā)手冊(cè)里要求禁止使用存儲(chǔ)過程?
存儲(chǔ)過程,最早的概念據(jù)我推斷是來自于Oracle,最早oracle是只有函數(shù)的概念,依稀記得是oracle8還是9才加的存儲(chǔ)過程package的概念,用于解決函數(shù)過于碎片化、不具備復(fù)雜的多邏輯功能,同時(shí)便于文件管理加入的概念。到后期基本所有數(shù)據(jù)庫(kù)也都有了存儲(chǔ)過程,如:mysql,sybase等。
存儲(chǔ)過程是基于數(shù)據(jù)庫(kù)底層的語(yǔ)法,與數(shù)據(jù)庫(kù)是相互依存的,且各個(gè)類型數(shù)據(jù)庫(kù)語(yǔ)法都不一樣。
Java語(yǔ)言在很大一部分的優(yōu)勢(shì)就是為了解耦合和可移植性,所以也有經(jīng)典的dao模式,目的也就是把數(shù)據(jù)庫(kù)和業(yè)務(wù)層分開。如果直接調(diào)用存儲(chǔ)過程,混淆了業(yè)務(wù)和數(shù)據(jù)庫(kù)分層,打破了Java模式設(shè)計(jì)的初衷。而且,如果用存儲(chǔ)過程寫,比如原來用Oracle數(shù)據(jù)庫(kù),現(xiàn)在客戶要求改成免費(fèi)的Mysql數(shù)據(jù)庫(kù),意味著基本所有的存儲(chǔ)過程全部要重寫,基本不具備可移植性。
當(dāng)然,萬事沒有絕對(duì)。阿里的整套體系龐大,數(shù)據(jù)庫(kù)的能力強(qiáng)大,中間件的主機(jī)也足夠橫向擴(kuò)展。像我們一般的項(xiàng)目沒那么多的主機(jī)和算力可搭配,有時(shí)碰上復(fù)雜的報(bào)表或復(fù)雜的邏輯,也不得不借用數(shù)據(jù)庫(kù)存儲(chǔ)過程來實(shí)現(xiàn)。
一般來說,項(xiàng)目上數(shù)據(jù)庫(kù)主機(jī)的配置比web主機(jī)相對(duì)強(qiáng)大得多,且存儲(chǔ)過程在數(shù)據(jù)庫(kù)操作邏輯上天然的快,在web主機(jī)不能橫向擴(kuò)展的情況下,也只能借用存儲(chǔ)過程來實(shí)現(xiàn)。當(dāng)然,用存儲(chǔ)過程來處理也是占比很少,逼不得已情況下才使用。
存儲(chǔ)過程的作用是什么?
存儲(chǔ)過程是一組予編譯的sql語(yǔ)句
它的優(yōu)點(diǎn):1.允許模塊化程序設(shè)計(jì),就是說只需要?jiǎng)?chuàng)建一次過程,以后在程序中就可以調(diào)用該過程任意次。
2.允許更快執(zhí)行,如果某操作需要執(zhí)行大量sql語(yǔ)句或重復(fù)執(zhí)行,存儲(chǔ)過程比sql語(yǔ)句執(zhí)行的要快。
3.減少網(wǎng)絡(luò)流量,例如一個(gè)需要數(shù)百行的sql代碼的操作有一條執(zhí)行語(yǔ)句完成,不需要在網(wǎng)絡(luò)中發(fā)送數(shù)百行代碼。
4.更好的安全機(jī)制,對(duì)于沒有權(quán)限執(zhí)行存儲(chǔ)過程的用戶,也可授權(quán)他們執(zhí)行存儲(chǔ)過程。