闡述ADO.NET計數器BUG說明舉例
學習使用ADO.NET很長時間了, 那天偶然發現ADO.NET計數器出現了很多的錯誤,這些錯誤我也不知道是因為什么原因下造成的,下面就和大家說說,簡單說說ADO.NET計數器bug。
ADO.NET計數器bug一.
當應用程序進程關閉后,計數器“SqlClient: Current # pooled connections”和“SqlClient: Current # connection pools”不會減為0,所以每重新運行一次應用程序性能計數器的值在上次的值的基礎上一直累加。這是計數器的錯誤顯示,實際上當應用程序關閉后connection pool和pooled connection就減為0。因為關閉應用程序后把性能監視器也關閉,重啟應用程序后再重新打開性能監視器就可以看出“SqlClient: Current # pooled connections”和“SqlClient: Current # connection pools”是重新從0開始上升的。
ADO.NET計數器bug二.
用斷點調試的情況下,連接串為"server = .;database = northwind;pooling = true;trusted_connection = true" 的connnection第一次Open的時候“SqlClient: Current # pooled connections”就從0變為2。但根據連接串參數的意義,只Open了一個connection,“SqlClient: Current # pooled connections”應該從0變為1(圖2是在沒有斷點調試的情況下得出的曲線)。這不是計數器顯示錯誤,而是ADO.ENT 1.1本身的bug,因為“User Connections”也隨著“SqlClient: Current # pooled connections”從0變為2。 #t#
為什么需要連接池?
完成建立/關閉一個連接的完整過程是一個消耗大量資源和時間的一個過程。想象一下一個ASP.NET的系統,里面包含大量訪問數據庫的代碼片,系統有大量的用戶同時在使用系統,如果程序每次Open/Close一個連接Data Provider都完成建立/關閉一個連接的完整過程,這樣的系統性能肯定讓人無法接受。
Data Provider提供連接池并通過連接池實現“物理連接”重復使用而避免頻繁地建立和關閉“ADO.NET計數器”,從而大大提高應用系統的性能。圖1描述一個應用的不同Client App使用連接池訪問數據庫,Data Provider負責建立和管理一個或者多個的連接池,每一個連接池里有一個或者多個連接,池里的連接就是“邏輯連接”。連接池里有N個連接表示該連接池與數據庫之間有N個“ADO.NET計數器”。增加一個連接,連接池與數據庫的“物理連接”就增加一個,減少一個連接,連接池與數據庫的“物理連接”就減少一個。