ado.net mysql 连接池_ADO.NET数据连接池
【IT168 技術文檔】21世紀什么最貴?數據庫連接。對于以數據庫做數據存儲基石的應用系統來說,數據庫連接是整個系統中最珍貴的資源之一。數據庫連接池是為了更有效地利用數據庫連接的最重要措施。它對于一個大型的應用系統的性能至關重要,特別是Web應用。ADO.NET Data Provider(以下簡稱Data Provider)會幫我們管理連接池,所以有人說使用連接池就像游兒童池一樣輕松。但并不是說有了Data Provider程序員就萬事無憂的,不正確地使用連接池可能導致你的應用在池里淹死。筆者希望通過本文能讓讀者徹底明白連接池的重要性以及能根據實際情況正確配置連接池的參數,明白實際應用中出現的連接泄漏、“死連接”等異常情況和應對方法,讓應用輕松暢游連接池。本文主要介紹ADO.NET 1.1的連接池。
1、什么是連接池
連接池是Data Provider提供的一個機制,使得應用程序使用的連接保存在連接池里而避免每次都要完成建立/關閉連接的完整過程。要理解連接池,先要理解程序里SqlConnection.Open()、SqlConnection.Close()和打開/關閉一個“物理連接”的關系。
Data Provider在收到連接請求時建立連接的完整過程是:先連接池里建立新的連接(即“邏輯連接”),然后建立該“邏輯連接”對應的“物理連接”。建立“邏輯連接”一定伴隨著建立“物理連接”。Data Provider關閉一個連接的完整過程是先關閉“邏輯連接”對應的“物理連接”然后銷毀“邏輯連接”。銷毀“邏輯連接”一定伴隨著關閉“物理連接”。SqlConnection.Open()是向Data Provider請求一個連接,Data Provider不一定需要完成建立連接的完整過程,可能只需要從連接池里取出一個可用的連接就可以;SqlConnection.Close()是請求關閉一個連接,Data Provider不一定需要完成關閉連接的完整過程,可能只需要把連接釋放回連接池就可以。
下面以一個例子來說明。本文例子都使用Console Application。我們使用操作系統的性能監視器來比較使用連接池與否,數據庫的“物理連接”數量的不同。因為性能監視器至少每一秒采集一次數據,為方便觀察效果,代碼中Open和Close連接后都Sleep一秒。
SqlConnection con=new SqlConnection("server=.;
database=northwind;pooling=false;trusted_connection=true");
for(inti=0;i<10;i++)
{
try
{
con.Open();
System.Threading.Thread.Sleep(1000);
}
catch(Exception e){Console.WriteLine(e.Message);}
finally
{
con.Close();
System.Threading.Thread.Sleep(1000);
}
}
首先,不使用連接池做測試。以上程序中pooing = false表示不使用連接池,程序使用同一個連接串Open & Close了10次連接,使用性能計數器觀察SQL Server的“物理連接”數量。從下面的鋸齒圖可以看出每執行一次con.Open(),SQLServer的“物理連接”數量都增加一,而每執行一次con.Close(),SQLServer的“物理連接”數量都減少一。由于不使用連接池,每次Close連接的時候Data Provider需要把“邏輯連接”和“物理連接”都銷毀了,每次Open連接的時候Data Provider需要 建立“邏輯連接”和“物理連接”,鋸齒圖因此而成。
圖1
下面啟用連接池再測試一次。把連接串的pooling參數改為true,另外在for循環后加上Console.Read()。
從下圖可以看出,從第一次Open到第執行完Console.Read()這段時間內,SQL Server的“物理連接”數量一直保持為1,直到關閉console應用程序的進程后SQL Server的“物理連接”數量才變為0。由于使用了連接池,每次Close連接的時候Data Provider只需把“邏輯連接”釋放回連接池,對應的“物理連接”則保持打開的狀態。每次Open連接的時候,Data Provider只需從連接池取出一個“邏輯連接”,這樣就可以使用其對應“物理連接”而不需建立新的“物理連接”,直線圖因此而成。
圖2
在ADO.NET 1.1下使用性能計數器觀察連接池有關計數器需要注意兩個bug。
(1)當應用程序進程關閉后,計數器“SqlClient: Current # pooled connections”和“SqlClient: Current # connection pools”不會減為0,所以每重新運行一次應用程序性能計數器的值在上次的值的基礎上一直累加。這是計數器的錯誤顯示,實際上當應用程序關閉后connection pool和pooled connection就減為0。因為關閉應用程序后把性能監視器也關閉,重啟應用程序后再重新打開性能監視器就可以看出“SqlClient: Current # pooled connections”和“SqlClient: Current # connection pools”是重新從0開始上升的。
(2)用斷點調試的情況下,連接串為"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。
為什么需要連接池?
完成建立/關閉一個連接的完整過程是一個消耗大量資源和時間的一個過程。想象一下一個ASP.NET的系統,里面包含大量訪問數據庫的代碼片,系統有大量的用戶同時在使用系統,如果程序每次Open/Close一個連接Data Provider都完成建立/關閉一個連接的完整過程,這樣的系統性能肯定讓人無法接受。
Data Provider提供連接池并通過連接池實現“物理連接”重復使用而避免頻繁地建立和關閉“物理連接”,從而大大提高應用系統的性能。圖1描述一個應用的不同Client App使用連接池訪問數據庫,Data Provider負責建立和管理一個或者多個的連接池,每一個連接池里有一個或者多個連接,池里的連接就是“邏輯連接”。連接池里有N個連接表示該連接池與數據庫之間有N個“物理連接”。增加一個連接,連接池與數據庫的“物理連接”就增加一個,減少一個連接,連接池與數據庫的“物理連接”就減少一個。
圖3
總結
以上是生活随笔為你收集整理的ado.net mysql 连接池_ADO.NET数据连接池的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 三大特性理解_java 三大特
- 下一篇: 组合赋权法之python