總的考慮方向
) 根據數據使用的方式來設計數據訪問層
) 緩存數據避免不必要的操作
) 使用服務帳戶進行連接
) 必要時連接盡早釋放
) 關閉可關閉的資源
) 減少往返
) 僅返回需要的數據
) 選擇適當的事務類型
) 使用存儲過程
根據性能維護性及實現難度來決定跨層數據傳遞的方式
具體實現
)選用合適的Data Provider
應盡量使用專用的Data Provider下面是一個性能比較表
可以看出SqlClient的速度是最快的其主要原因是其他的數據提供者都經過的幾個層次的轉換
可以看出SqlClient直接訪問DB Netlib而其他的數據提供者都經過了兩層轉換因此在設計多層應用的時候並不是層次越多越好而是應該在可擴展性與性能間取折中增加層次是會降低性能的
) 數據庫連接
i 在方法中打開和關閉連接即不要在類的構造函數中打開連接在類的析構函數中關閉連接
ii 使用完連接明確地關閉因為有連接池的支持關閉連接只是將連接放回連接池並不是真正銷毀不會帶來性能開銷而會增加連接池中可用連接提升性能
iii 當使用DataReaders時指定CommandBehaviorCloseConnection
iv 當使用Fill()與Updata()時不要手動打開連接因為DataAdapter會自動開啟連接但是如果是Command則需要手動開啟
v 避免檢查OleDbConnection的State屬性其性能開銷相當大
vi 使用連接池這種方法可以大幅度提高性能默認的情況下通過SqlClient連接數據庫時會使用連接池另可以通過連接字符串來控制連接池的最大值最小值以及是否開啟連接池
) SQL指令
i 檢查SQL的輸入並使用參數直接使用字符連接容易遭受注入式攻擊
ii 僅返回需要的行和例
iii 對大的數據集使用分頁功能
iv 批次執行SQL避免多次往返
v 如果沒有數據返回則使用ExecuteNonQuery方法
vi 當返回一個標量時使用ExecuteScalar方法
vii 不要在運行時間使用CommandBuilder盡管很省事但是開銷很大
) 存儲過程
i 盡量使用存儲過程
ii 對於OleDbCommand指令類型為CommandTypeText
iii 使用SqlCommand指令類型為CommandTypeStoredProcedure
iv 盡可能使用輸出參數
v 考慮在SQL Server中SET NOCOUNT ON即關閉SQL Server的記數功能
) 事務
) 使用參數
i 在存儲過程上使用參數
ii 創建參數並指定類型
iii 可將參數對象進行緩存
) DataReader和DataSet
i DataReader對象需要關閉
ii 用DataReader時應使用CommandBehaviorCloseConnection關閉連接
iii DataReader應用在只讀只向前翻滾的數據訪問場景
iv 只想快速訪問數據不需要緩存功能應使用DataReader
DataSet在需要數據緩存並在不同層間傳遞時使用它可以存放多個結果集可以在離線的情況下自由定位查找數據
總的來說提高性能會降低可擴展性以及維護難度應在滿足功能與非功能需求的情況下提高性能
From:http://tw.wingwit.com/Article/program/net/201311/12701.html