之前寫了很多資料庫開發方面的程式,有的時候需要連續操作資料庫,就在想這麼密 集去操作資料庫會不會大量消耗資源,因為記憶體回收機制並不是馬上執行。於是,特意瞭解了一下情況。
其實,資料庫連接並不是託管資源,所以記憶體回收管不到它。另外Stream (檔案流),COM (組件),Socket等這些都是非託管的資源。
正統的資料庫Oracle,Sql Server,MySql等,都提供了一中串連池的機制來處理這種狀況。下面就來瞭解一下這個神秘的串連池。
串連到資料庫伺服器通常由幾個需要很長時間的步驟組成。必須建立物理通道(例如通訊端或具名管道),必須與伺服器進行初次握手,必須分析連接字串資訊,必須由伺服器對串連進行身分識別驗證,必須運行檢查以便在當前事務中登記,等等。
實際上,大多數應用程式僅使用一個或幾個不同的串連配置。這意味著在執行應用程式期間,許多相同的串連將反覆地開啟和關閉。為了使開啟串連花費的系統開銷最小,ADO.NET
使用稱為串連池的最佳化方法。
串連池使新串連必須開啟的次數得以減少。池進程保持物理串連的所有權。通過為每個給定的串連配置保留一組活動串連來管理串連。每當使用者在串連上調用Open
時,池進程就會尋找池中可用的串連。如果某個池串連可用,會將該串連返回給調用者,而不是開啟新串連。應用程式在該串連上調用Close 時,池進程會將串連返回到活動串連池集中,而不是關閉串連。串連返回到池中之後,即可在下一個Open
調用中重複使用。
只有配置相同的串連可以建立池串連。ADO.NET 同時保留多個池,每種配置各一個。在使用整合的安全性時,串連按照連接字串以及
Windows 標識分到多個池中。還根據串連是否已在事務中登記來建立池串連。
池串連可以顯著提高應用程式的效能和可縮放性。預設情況下,在 ADO.NET 中啟用串連池。除非顯式禁用,否則,在應用程式中開啟和關閉串連時,池進程會對串連進行最佳化。還可以提供幾個連接字串修飾符來控制串連池的行為。有關更多資訊,請參見本主題後面的“使用連接字串關鍵字控制串連池”。
------------------------------------------------------------------------------------------
在初次開啟串連時,將根據完全符合演算法建立串連池,該演算法將池與串連中的連接字串關聯。每個串連池都與一個不同的連接字串相關聯。開啟新串連時,如果連接字串並非與現有池完全符合,將建立一個新池。按進程、應用程式定義域、連接字串以及
Windows 標識(在使用整合的安全性時)來建立池串連。連接字串還必須是完全符合的;按不同順序為同一串連提供的關鍵字將分到單獨的池中。
在以下 C# 樣本中建立了三個新的SqlConnection 對象,但是管理時只需要兩個串連池。注意,根據為Initial
Catalog 分配的值,第一個和第二個連接字串有所不同。
using (SqlConnection connection = new SqlConnection("Integrated Security=SSPI;Initial Catalog=Northwind"))
{
connection.Open();
// 建立串連池A
}
using (SqlConnection connection = new SqlConnection("Integrated Security=SSPI;Initial Catalog=pubs"))
{
connection.Open();
// 建立串連池B,因為連接字串不同
}
using (SqlConnection connection = new SqlConnection("Integrated Security=SSPI;Initial Catalog=Northwind"))
{
connection.Open();
// 使用串連池A,因為連接字串與串連池A相同
}
如果 MinPoolSize 在連接字串中未指定或指定為零,池中的串連將在一段時間不活動後關閉。但是,如果指定的MinPoolSize 大於零,在AppDomain 被卸載並且進程結束之前,串連池不會被破壞。非活動或空池的維護只需要最少的系統開銷。