ADO.NET連接池三方面講解
連接池還是比較常用的,于是我上網收集了很多關于ADO.NET連接池,在這里分享給大家吧。數據庫連接是一種重要的、有限的、開銷昂貴的資源,因此用好連接對象是任何應用的最基本的要求。使用數據庫連接的要點可總結如下:保存連接字符串應注意安全。打開連接應遲,關閉連接應早。連接字符串是訪問數據庫的鑰匙。連接字符串除了說明要訪問的數據之外,還包含了用戶為什么可以訪問那些數據的身份證明。在執行數據庫操作時,用戶身份證明是確定數據訪問權限的最重要的因素。
ADO.NET連接池原理
#T#連接池允許我們通過一個緩沖池重用現有的連接對象,避免每次使用連接對象時都要新建一個對象。采用連接池之后,只要少量的連接對象就可以滿足大量客戶端的需要。每一個連接池都與一個獨立的連接字符串及其事務上下文關聯。每次打開一個新的連接,數據提供者會嘗試將指定的連接字符串與連接池的字符串進行匹配。如果匹配失敗,數據提供者創建一個新的連接并將它加入連接池。連接池被創建之后,除非進程結束,否則不會被拆除。有人認為這種處理方式會影響性能,其實不然,維護一個不活動的或者空的連接池不需要多少開銷。
連接池創建之后,系統會創建一些連接對象并將它們加入連接池,直至達到額定的最小連接對象數量。以后,系統會根據需要新建和加入連接對象,一直到達最大連接對象數量限額為止。如果程序請求一個連接對象時沒有空閑的連接對象可用,且連接池里面的對象數量已達到上限,則請求被放入隊列,一旦有連接被釋放回緩沖池就立即取出使用。
避免用編程的方式構造連接字符串。如果通過合并多個輸入數據的方式構造出連接字符串,很容易給注入式攻擊以可乘之機。如果必須用到用戶輸入的數據,務必進行嚴格的驗證。
關閉連接
關閉一個連接時,連接對象被返回給連接池以便重用,但這時實際的數據庫連接并未被拆除。如果禁用了連接池,則實際的數據庫連接也被關閉。這里必須強調的一點時,連接對象使用完畢后應當顯式關閉并將它返回給連接池,不要依靠垃圾收集器來釋放連接。實際上,當連接對象的引用超出有效范圍時,連接不一定被關閉——垃圾收集器的功能是拆除代表物理連接的.NET封裝對象,但這并不意味著底層的連接也被關閉了。
調用Close或Dispose方法可以將連接釋放回連接池。只有當生存期結束或出現嚴重錯誤時,連接對象才會被從連接池刪除。
ADO.NET連接池與安全
如果一個應用程序的所有數據訪問操作都使用同樣的連接字符串,連接池的優勢將發揮到極限。但是,這只是一種理想化了的狀況,很可能與應用程序的其他要求存在沖突。例如,如果只使用一個連接字符串,要在數據庫這一層次上執行安全控制就很困難了。
另一方面,如果讓每一個用戶分別使用自己的連接字符串(即為每一個用戶分別設定數據庫帳戶),勢必出現大量小型的連接池,許多連接根本不會被重用。依照慣例,這類問題的最佳解決方案是尋找兩個極端之間的一個適當折衷點。我們可以設置一組具有代表性的公用帳戶,同時修改存儲過程,使之接受一個表示用戶標識的參數,存儲過程根據傳入的用戶標識執行不同的操作。