存儲過程,最早的概念據我推斷是來自于Oracle,最早oracle是只有函數的概念,依稀記得是oracle8還是9才加的存儲過程package的概念,用于解決函數過于碎片化、不具備復雜的多邏輯功能,同時便于文件管理加入的概念。到后期基本所有數據庫也都有了存儲過程,如:mysql,sybase等。
存儲過程是基于數據庫底層的語法,與數據庫是相互依存的,且各個類型數據庫語法都不一樣。
Java語言在很大一部分的優勢就是為了解耦合和可移植性,所以也有經典的dao模式,目的也就是把數據庫和業務層分開。如果直接調用存儲過程,混淆了業務和數據庫分層,打破了Java模式設計的初衷。而且,如果用存儲過程寫,比如原來用Oracle數據庫,現在客戶要求改成免費的Mysql數據庫,意味著基本所有的存儲過程全部要重寫,基本不具備可移植性。
當然,萬事沒有絕對。阿里的整套體系龐大,數據庫的能力強大,中間件的主機也足夠橫向擴展。像我們一般的項目沒那么多的主機和算力可搭配,有時碰上復雜的報表或復雜的邏輯,也不得不借用數據庫存儲過程來實現。
一般來說,項目上數據庫主機的配置比web主機相對強大得多,且存儲過程在數據庫操作邏輯上天然的快,在web主機不能橫向擴展的情況下,也只能借用存儲過程來實現。當然,用存儲過程來處理也是占比很少,逼不得已情況下才使用。