ado.net mysql 连接池_ADO.NET数据库连接池的介绍 | 学步园
摘錄自MSDN:
建立池連接可以顯著提高應用程序的性能和可縮放性。SQL Server .NET Framework 數據提供程序自動為 ADO.NET
客戶端應用程序提供連接池。您也可以提供幾個連接字符串修飾符來控制連接池行為,請參見本主題內下文中“使用連接字符串關鍵字控制連接池”這一節。
池的創建和分配
當連接打開時,將根據一種精確的匹配
在以下示例中,將創建三個新的 SqlConnection
對象,但只需要使用兩個連接池來管理這些對象。請注意,第一個和第二個連接字符串的差異在于為 Initial
Catalog 分配的值。
SqlConnection conn = new SqlConnection();
conn.ConnectionString = "Integrated Security=SSPI;Initial Catalog=northwind";
conn.Open();
// Pool A is created.
SqlConnection conn = new SqlConnection();
conn.ConnectionString = "Integrated Security=SSPI;Initial Catalog=pubs";
conn.Open();
// Pool B is created because the connection strings differ.
SqlConnection conn = new SqlConnection();
conn.ConnectionString = "Integrated Security=SSPI;Initial Catalog=northwind";
conn.Open();
// The connection string matches pool A.
連接池一旦創建,直到活動進程終止時才會被毀壞。非活動或空池的維護只需要最少的系統開銷。
連接的添加
連接池是為每個唯一的連接字符串創建的。當創建一個池后,將創建多個連接對象并將其添加到該池中,以滿足最小池大小的要求。連接將根據需要添加到池中,直至達到最大池大小。
當請求 SqlConnection
對象時,如果存在可用的連接,則將從池中獲取該對象。若要成為可用連接,該連接當前必須未被使用,具有匹配的事務上下文或者不與任何事務上下文相關聯,并且具有與服務器的有效鏈接。
如果已達到最大池大小且不存在可用的連接,則該請求將會排隊。當連接被釋放回池中時,連接池管理程序通過重新分配連接來滿足這些請求。對
Connection 調用 Close 或 Dispose 時,連接被釋放回池中。
警告建議使用完 Connection
后始終將其關閉,以便連接可以返回到池中。這可以使用 Connection 對象的 Close 或 Dispose
方法來實現。不是顯式關閉的連接可能不會添加或返回到池中。例如,如果連接已超出范圍但沒有顯式關閉,則僅當達到最大池大小而該連接仍然有效時,該連接才會返回到連接池中。
注意???不要在類的 Finalize 方法中對
Connection、DataReader 或任何其他托管對象調用 Close 或
Dispose。在終結器中,僅釋放類直接擁有的非托管資源。如果類不擁有任何非托管資源,則不要在類定義中包含 Finalize
方法。有關更多信息,請參見垃圾回收編程。
連接的移除
如果連接生存期已過期,或者連接池管理程序檢測到與服務器的連接已斷開,連接池管理程序將從池中移除該連接。請注意,只有在嘗試與服務器進行通信后,才可以檢測到這種情況。如果發現某連接不再連接到服務器,則會將其標記為無效。連接池管理程序會定期掃描連接池,查找已釋放到池中并標記為無效的對象。找到后,這些連接將被永久移除。
如果存在與已消失的服務器的連接,那么即使連接池管理程序未檢測到已斷開的連接并將其標記為無效,仍有可能將此連接從池中取出。當發生這種情況時,將生成異常。但是,為了將該連接釋放回池中,仍必須將其關閉。
事務支持
連接是根據事務上下文來從池中取出并進行分配的。請求線程和所分配的連接的上下文必須匹配。因此,每個連接池實際上又分為不具有關聯事務上下文的連接以及
N 個各自包含與一個特定事務上下文的連接的子部分。
當連接關閉時,它將被釋放回池中,并根據其事務上下文放入相應的子部分。因此,即使分布式事務仍然掛起,仍可以關閉該連接而不會生成錯誤。這樣,您就可以在隨后提交或中止分布式事務。
使用連接字符串關鍵字控制連接池
SqlConnection 對象的 ConnectionString
屬性支持連接字符串鍵/值對,這些鍵/值對可用于調整連接池邏輯的行為。
下表描述了可用于調整連接池行為的 ConnectionString 值。
名稱
默認值
說明
Connection Lifetime
0
當連接返回到池中時,將對它的創建時間和當前時間進行比較,如果時間間隔超過由Connection Lifetime
指定的值(以秒為單位),則會毀壞該連接。在聚集配置中可以使用它來強制在運行服務器和剛聯機的服務器之間達到負載平衡。
如果值為零 (0),則將使池連接具有最大的超時期限。
Connection Reset
'true'
確定在從池中移除數據庫連接時是否將其重置。對于 Microsoft SQL Server 版本 7.0,如果設置為false,將避免在獲取連接時經歷一個額外的往返過程,但必須注意的是連接狀態(如數據庫上下文)不會被重置。
Enlist
'true'
當為true 時,如果存在事務上下文,池管理程序將自動在創建線程的當前事務上下文中登記連接。
Max Pool Size
100
池中允許的最大連接數。
Min Pool Size
0
池中維護的最小連接數。
Pooling
'true'
當為true時,將從相應的池中取出連接,或者在必要時創建連接并將其添加到相應的池中。
連接池的性能計數器
SQL Server .NET Framework
數據提供程序添加了幾個性能計數器,它們將使您能夠微調連接池特性,檢測與失敗的連接嘗試相關的間歇性問題,并檢測與對 SQL Server
的超時請求相關的問題。
下表列出了可以在“.NET CLR 數據”性能對象下的“性能監視器”中訪問的連接池計數器。
計數器
說明
SqlClient: Current # pooled and non pooled connections
當前池連接或非池連接的數目。
SqlClient: Current # pooled connections
當前所有池中與特定進程關聯的連接的數目。
SqlClient: Current # connection pools
當前與特定進程關聯的池的數目。
SqlClient: Peak # pooled connections
自特定進程開始以來所有池中的連接數峰值。請注意:此計數器只有在與特定進程實例關聯時才可用。_Global
實例始終返回 0。
SqlClient: Total # failed connects
打開連接的嘗試因任何原因而失敗的總次數。
注意???將 SQL Server .NET Framework
數據提供程序性能計數器與 ASP.NET 應用程序一起使用時,只有 _Global 實例是可用的。因此,性能計數器返回的值是所有 ASP.NET
應用程序的計數器值的總和。
總結
以上是生活随笔為你收集整理的ado.net mysql 连接池_ADO.NET数据库连接池的介绍 | 学步园的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 保存的图数据丢失_锡柴自主刷写和备份共享
- 下一篇: linux cmake编译源码,linu