北京赛车单双技巧 北京赛车pk10黑客软件 北京pk10计划免费软件 pk10前二做号工具 pk10专业预测 pk10民间高手 北京pk10挂机选号经验分享模式 pk10冠军3码倍投计划 北京赛车计划app手机版 北京赛车开奖软件 pk10最牛稳赚模式最新 pk10全天免费计划 易算北京pk10准不准 pk10赛车7码技巧 pk10八码滚雪球3期一收

存儲過程能不能用在我們的項目中的思考

2/9/2008來源:Oracle教程人氣:5336


  想想我們的項目里能不能用存儲過程
  
  不能:因為項目要涉及到不同的數據庫,更多的是為了以后換庫方便。在代碼里直接寫SQL語句進行查詢。發生換庫時,只要簡單的換一下連接字符串就可以了。這叫以不變應萬變,怎么講呢,代碼不變,數據庫愛怎么變就怎么變換庫可以靈活到什么程度,即使公司打算把Oracle項目換成access做單機版也沒有任何問題。
  
  能:存儲過程的執行速度要快得多,一方面它不需要在業務服務器和數據庫服務器之間折返,更因為它有一次編譯,較投遞 SQL語句而言,效率更高。況且Oracle可以用java,C 編寫更高效的存儲過程,SQL Server 2005則可以使用 .net,毫無疑問,存儲過程的速度比美名其曰的業務組件要快的多。
  
  一般人喜歡折衷。行嘛,既然二者都有理,我在適當的場合選擇適當的技術,需要效率高的時候,我才用存儲過程。
  
  我喜歡一邊倒。既然存儲過程效率高,為什么不用存儲過程?
  
  為了實現一個很小的業務運算,需要把數據提過來,然后又投回去,需要把數據庫的數據類型轉換成程序語言的數據類型,做完這些無謂的工作之后,最后的效果卻是拋回到數據庫,只要想到這一點,我們為什么不使用存儲過程而采用這種低效的方案。
  
  須知現在的問題背景和那個數據庫山頭林立的年代已經完全不同了。假如說數據庫也存在階段的話,那種能否支持存儲過程都參差不齊的年代屬于石器時代。目前的數據庫,連MySQL都要支援存儲過程了,也就是說,它們基本上都在同一條起跑線。因此,無須考慮萬一我寫了存儲過程,而“升遷”的目標數據庫不支援存儲過程的問題。
  
  但是,各種數據庫的存儲過程的編寫方法并不一致。假如從SQLServer轉移到Oracle,意味著幾乎所有的存儲過程都要重寫。這是換庫說在新時代的新說辭。這個說法是有事實憑據的,換庫多麻煩,存儲過程要全部重寫。
  
  實際上這個問題很輕易解決——代碼生成。做好一個存儲過程的模板,將模板中的數據庫類型標識換成"Oracle",重新生成一次便萬事大吉了。既然不需要手工重寫,這個說法自然也站不住腳。或者制做一種調和于主流數據庫存儲過程語言的中間語言也可以,一個簡單的編譯器將它轉換為特定于某個數據庫的語言。
  
  使用存儲過程除了效率高之外還有其他優勢:
  
  a) 業務規則腳本化。編寫存儲過程的SQL語句是一種業務規則的腳本,當業務規則發生變化時,無須對業務組件使用編譯和替換的高超魔法——須知越高超越危險。存儲過程將這個問題簡單的化解。
  
  b) 可以直接應用數據庫內置的權限治理。假如不使用存儲過程,一個業務規則能不能運行,需要在業務組件里進行控制,因此業務組件中需要另起一套權限控制框架,這個框架和數據庫本身的權限控制是同構的,正所謂疊床架屋,多此一舉。而利用數據庫的權限治理則從源頭把關,直接安全。
  
  c) 語言純粹。和在 .net/java代碼中混雜數據庫操控的笨拙代碼相比,存儲過程完全使用SQL語言,盡管各種數據庫的方言有異。提取數據,處理數據,保存結果的工作用同一種語言融在一處,無疑屬于更好的編程風格。這個問題可以類比于 ASP->asp.net,從代碼混雜到各自純粹。.net3.0 意圖使用 DLink技術把 SQL 語言變成編程語言的一部分,想法是類似的。
  
  但相較于各自純粹而言,那種在 VB里直接寫 FROM SELECT WHERE的做法恐怕也不可取。雖然我完全支持 Class Employee 這種語言級別的 ORM。
  
  d) 便于移植。和以前數據庫山頭林立的年代不同,現在我們更不放心的是平臺。假如我們使用 .net 平臺,意味著我們放棄了傳說中更堅強的linux —— mono 恐怕還靠不住。假如我們使用 java,雖然得到了跨平臺的好處,但是只能做 bs,而在 Windows平臺又失去了 .net 所具備的高速度——后者是致命的。另外,假如客戶需要一個對配置要求不高反應又不遲鈍的 cs 程序,也許用 Delphi 更能符合用戶的愿望。
我們通常要在 win32/.net/java 平臺之間做出選擇。而這種選擇沒有回頭路可走。假如我們把數據庫操作代碼放在數據訪問層,把業務規則代碼放在業務層,一切都特定于某種平臺了。相反,假如使用存儲過程,業務規則部署于數據庫中,數據訪問層和業務層都只剩下一個殼,代碼大為簡化,使用任何平臺的語言來改寫都可以快速完工。想想看,一周的時間就可以在一個新平臺寫完前端,何樂而不為呢。
  
  e) 方便的使用數據庫的事務機制。在程序語言中控制事務,無論哪個平臺都有隔靴搔癢之感,而在純粹的SQL語言則顯得心應手,渾然一體。
  
  就我理解,像便于換庫這種理由,從歷史原因來考察,是軟件開發傷口上的痛。這個問題一直到ODBC等等方案風行之后才得到解除。以前特定于某種類型的數據庫的程序,升遷所花費的代價是非常昂貴的。這次大動蕩給一代人投下了心理陰影,提到特定于某種數據庫時,便產生一朝被蛇咬,十年怕井繩的懼怕心理。
  
  類似的事情還有函數嵌套函數。結構化程序設計中,一個要害性的觀念就是功能獨立,其程序功能被劃分為多個獨立的功能函數。但有些功能是受雇于另外的子功能的,并非第一級子功能。例如,通常一個遞歸會寫成兩塊,一塊發起遞歸,一塊遞歸,在類似無嵌套函數的語言中,發起遞歸會變成一個函數,遞歸過程又作為一個函數,這兩個函數地位平行。而在支持嵌套函數的語言中,遞歸過程可以實現為一個子函數,嵌入進發起函數。但是現在的語言多不支持嵌套,因為OO浪潮使人們畏懼結構化,即使本不相左的交集。唯最近微軟披露的 .net 3.0 框架計劃引入該機制,也許是Anders很懷念Pascal,當然,更大的可能是微軟也意識到了這個問題。


pk10有什么方法平刷
北京赛车单双技巧 北京赛车pk10黑客软件 北京pk10计划免费软件 pk10前二做号工具 pk10专业预测 pk10民间高手 北京pk10挂机选号经验分享模式 pk10冠军3码倍投计划 北京赛车计划app手机版 北京赛车开奖软件 pk10最牛稳赚模式最新 pk10全天免费计划 易算北京pk10准不准 pk10赛车7码技巧 pk10八码滚雪球3期一收
排列五排列五走势图 官方天津快乐十分下载 幸运飞艇pk10计划 体育直播cctv5直播排球 网赌赢了200万犯法吗 今天山西快乐分走势图 全天老北京pk赛车计划 北京pk拾每天赚2000 体彩排列三开奖号走势图