三分鐘讓你了解什么是ADO.NET連接池
ADO.NET經過長時間的發展,很多用戶都很了解ADO.NET了,這里我發表一下個人理解,和大家討論討論。數據庫連接,對于以數據庫做數據存儲基石的應用系統來說,數據庫連接是整個系統中最珍貴的資源之一。數據庫連接池是為了更有效地利用數據庫連接的最重要措施。它對于一個大型的應用系統的性能至關重要,特別是Web應用。ADO.NET Data Provider(以下簡稱Data Provider)會幫我們管理連接池,所以有人說使用連接池就像游兒童池一樣輕松。但并不是說有了Data Provider程序員就萬事無憂的,不正確地使用ADO.NET連接池可能導致你的應用在池里淹死。筆者希望通過本文能讓讀者徹底明白連接池的重要性以及能根據實際情況正確配置連接池的參數,明白實際應用中出現的連接泄漏、“死連接”等異常情況和應對方法,讓應用輕松暢游連接池。本文主要介紹ADO.NET連接池。
什么是ADO.NET連接池
#T#連接池是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(int i = 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);
- }
- }