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