1,對於ASP.NET資料庫連接池可以使用一組名稱-值對以連結字串的形式配置連結池。例如,可以配置池是否有效(預設是有效),池的最大、最小容量,用於開啟連結的排隊請求被阻斷的時間。下面的樣本字串配置了池的最大和最小容量。
"Server=(local); Integrated Security=SSPI; Database=Northwind;
Max Pool Size=75; Min Pool Size=5"
ASP.NET資料庫連接池摘要
串連池允許應用程式從串連池中獲得一個串連並使用這個串連,而不需要為每一個串連請求重建立立一個串連。一旦一個新的串連被建立並且放置在串連池中,應用程式就可以重複使用這個串連而不必實施整個資料庫連接建立過程。
當應用程式請求一個串連時,串連池為該應用程式分配一個串連而不是重建立立一個串連;當應用程式使用完串連後,該串連被歸還給串連池而不是直接釋放。
2,
串連池減少新串連需要開啟的次數。池進程保持物理串連的所有權。通過為每個給定的串連配置保留一組活動串連來管理串連。只要使用者在串連上調用 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();
// Pool A is created.
}
using (SqlConnection connection = new SqlConnection(
"Integrated Security=SSPI;Initial Catalog=pubs"))
{
connection.Open();
// Pool B is created because the connection strings differ.
}
using (SqlConnection connection = new SqlConnection(
"Integrated Security=SSPI;Initial Catalog=Northwind"))
{
connection.Open();
// The connection string matches pool A.
}
如果 MinPoolSize 在連接字串中未指定或指定為零,池中的串連將在一段時間不活動後關閉。但是,如果指定的 MinPoolSize 大於零,在 AppDomain 被卸載並且進程結束之前,串連池不會被破壞。非活動或空池的維護只需要最少的系統開銷
添加串連
串連池是為每個唯一的連接字串建立的。當建立一個池後,將建立多個連線物件並將其添加到該池中,以滿足最小池大小的要求。串連根據需要添加到池中,但是不能超過指定的最大池大小(預設值為 100)。串連在關閉或斷開時釋放回池中。
在請求 SqlConnection 對象時,如果存在可用的串連,將從池中擷取該對象。串連要可用,必須未使用,具有匹配的事務上下文或未與任何事務上下文關聯,並且具有與伺服器的有效連結。
串連池進程通過在串連釋放回池中時重新分配串連,來滿足這些串連請求。如果已達到最大池大小且不存在可用的串連,則該請求將會排隊。然後,池進程嘗試重建立立任何串連,直到到達逾時時間(預設值為 15 秒)。如果池進程在連線逾時之前無法滿足請求,將引發異常。
移除串連
串連池進程定期掃描串連池,尋找沒有通過 Close 或 Dispose 關閉的未用串連,並重建立立找到的串連。如果應用程式沒有顯式關閉或斷開其串連,串連池進程可能需要很長時間才能重建立立串連,所以,最好確保在串連中顯式調用 Close 和 Dispose。
如果串連長時間空閑,或池進程檢測到與伺服器的串連已斷開,串連池進程會將該串連從池中移除。注意,只有在嘗試與伺服器進行通訊之後才能檢測到斷開的串連。如果發現某串連不再串連到伺服器,則會將其標記為無效。無效串連只有在關閉或重建立立後,才會從串連池中移除。
如果存在與已消失的伺服器的串連,那麼即使串連池管理程式未檢測到已斷開的串連並將其標記為無效,仍有可能將此串連從池中取出。這種情況是因為檢查串連是否仍有效系統開銷將造成與伺服器的另一次往返,從而抵消了池進程的優勢。發生此情況時,初次嘗試使用該串連將檢測串連是否曾斷開,並引發異常。
ASP.NET資料庫連接池優點
使用串連池的最主要的優點是效能。建立一個新的資料庫連接所耗費的時間主要取決於網路的速度以及應用程式和資料庫伺服器的(網路)距離,而且這個過程通常是一個很耗時的過程。而採用資料庫連接池後,資料庫連接請求可以直接通過串連池滿足而不需要為該請求重新串連、認證到資料庫伺服器,這樣就節省了時間。
ASP.NET資料庫連接池缺點
資料庫連接池中可能存在著多個沒有被使用的串連一直串連著資料庫(這意味著資源的浪費)。
技巧和提示
1.當你需要資料庫連接時才去建立串連池,而不是提前建立。一旦你使用完串連立即關閉它,不要等到垃圾收集器來處理它。
2.在關閉資料庫連接前確保關閉了所有使用者定義的事務。
3.不要關閉資料庫中所有的串連,至少保證串連池中有一個串連可用。如果記憶體和其他資源是你必須首先考慮的問題,可以關閉所有的串連,然後在下一個請求到來時建立串連池