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