.NET 應用架構指導

iDotNetSpace發表於2010-06-03

查詢

  查詢是資料訪問層中主要的操作。他們是將應用的請求翻譯為對資料庫的CRUD行為。因為查詢如此關鍵,應該優化它們,來最大化資料庫的效能。可以參考下面的設計原則:

  •   使用引數化的SQL查詢,可以減少安全問題,減少SQL隱碼攻擊。不要使用使用者輸入的內容進行字串的拼接。
  •   考慮使用物件建立查詢。例如:實現查詢物件模式,或者使用ADO.NET支援的引數化查詢。考慮為查詢的執行優化資料庫的資料結構。
  •   在動態構建SQL查詢的時候,避免混入業務邏輯,使用邏輯生成SQL語句,會導致難以維護和除錯。

  儲存過程

  在過去,和動態SQL相比,儲存過程代表效能的提高。但是,現在的資料庫引擎,儲存過程和動態的引數化的SQL執行的效能差不多。考慮使用儲存過程的主要因素是,抽象,可維護性,和你的環境。出於安全和效能考慮,使用儲存過程,避免在儲存過程中動態拼接SQL。引數會影響對快取的執行計劃的使用,而不是重新建立一個執行計劃。當引數型別和數量改變的時候,會產生新的執行計劃,會降低效能。可以參考下面的設計原則:

  •   使用特定型別的引數作為儲存過程的輸入引數,返回單個值。考慮使用xml格式傳遞列表。不要為了顯示,而在儲存過程中格式化資料。相反,返回適當的資料,在表現層進行格式化。
  •   如果非要在儲存過程中動態生成SQL,使用引數或者是資料庫變數。但是要記住,在儲存過程中動態建立SQL會影響效能、安全和可維護性。
  •   避免在處理資料的時候建立臨時表。但是,如果非要使用臨時表,考慮將他們建立在記憶體中,而不是硬碟上。
  •   實現適當的異常處理,給應用返回可以處理的程式碼。

  儲存過程 VS. 動態SQL

  這裡所說的動態SQL,指的是在程式碼中動態生成SQL,而不是說在儲存過程中動態生成SQL。在選擇兩者的時候,你一定要考慮抽象的需求,可維護性,和環境的限制。另外,兩者的選擇還要考慮開發者的偏好和技術特點。

  使用儲存過程的主要優點是,對於資料庫,提供了一個抽象層,當資料庫改變的時候,最小化對於程式碼的影響。安全很容易實現和管理,因為你可以限制對儲存過程的訪問,使用大多數資料庫都提供的安全特性可以實現細粒度的管理。

  使用動態SQL的主要優點是,他們比儲存過程更靈活,可以快速開發。很多ORM框架都會給你動態生成查詢語句,可以減少開發的程式碼編寫量。

  選擇的時候,可以參考下面的設計原則:

  •   如果你的應用很小,單一的客戶端,很少的業務邏輯,動態SQL通常是較好的選擇。
  •   如果你的應用較大,有多個客戶端操作,需要考慮抽象需求。考慮使用儲存過程,或者是用ORM工具提供的查詢。
  •   對於資料密集的操作,儲存過程允許你更加貼近資料,可以提高效能。
  •   如果為了在資料庫改變的時候,最小化程式碼的改變。考慮通過儲存過程訪問資料庫。可以將資料庫的改變分離處理,可以優化儲存過程。
  •   考慮你的開發團隊。如果團隊對資料庫不是很熟悉,考慮使用工具或者是和你的團隊更加匹配的模式。
  •   在考慮使用動態SQL的時候,你應該理解資料庫的改變對程式碼造成的改變。你應該實現資料訪問層,從業務邏輯層解耦出來,專門執行資料庫查詢。
  •   考慮除錯支援。動態SQL對開發者來說容易除錯。

  事務

  如果事務包括的所有資訊和行為都執行完畢,事務才算是完成,對資料庫的改變是永久的。在資料庫操作發生錯誤的時候,事務支援回滾,可以保持資料庫資料的一致性。

  確定適當的併發模型,和確定如何管理事務是非常重要的。在併發的時候,可以選擇樂觀鎖,或者是悲觀鎖。樂觀鎖,在資料上沒有鎖,由程式碼檢查更新,通常使用一個時間戳,資料從上次獲取之後沒有被修改。在悲觀鎖中,鎖定資料,不能被另外一個操作更新,直到資料被解鎖。

  可以參考下面的設計原則:

  •   考慮事務的邊界,在需要的時候使用事務。在SQL Server中,每一個SQL預設就是一個事務。
  •   在使用了鎖的事務中,儘可能的減少執行時間。避免在需要長時間執行的事務中使用鎖,避免在訪問共享資料的時候使用鎖。避免大量的使用鎖,可能會造成死鎖。

  驗證

  設計一個有效的輸入和資料驗證策略,對於系統的安全性是非常關鍵的。需要驗證從其它層或者是第三方元件提供的資料,對於從資料來源獲取的資料也要驗證。可以參考下面的設計原則:

  •   驗證所有從外部呼叫而來的資料。確保你正確的處理了null值,過濾了非法的字元。
  •   考慮驗證的目的。例如:在使用使用者的輸入動態建立SQL的時候,應該檢查字元的模式,避免發生SQL隱碼攻擊。
  •   如果驗證失敗,返回有用的錯誤資訊。

  XML

  對於互動性和維護性來說,xml非常有用。出於效能原因,在使用xml處理大量資料的時候需要小心。參考下面的設計原則:

  •   考慮使用xml reader和writer讀寫xml格式的資料,尤其是對於大量的xml資料。如果你需要和一個關係型的資料庫互動,考慮使用支援這一功能的物件,例如ADO.NET中的DataSet。
  •   考慮使用xml定義格式,為資料儲存和傳輸提供驗證。考慮為複雜的資料結構提供自定義驗證,但是,要記住驗證將會帶來效能損失。
  •   在資料庫儲存xml格式的資料。如果你需要查詢xml資料,建立索引。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-664296/,如需轉載,請註明出處,否則將追究法律責任。

相關文章