SQL Server .NET Framework 資料提供者的連接共用

共用連接能夠大幅提高應用程式的效能和延展性 (Scalability)。SQL Server 的 .NET Framework 資料提供者自動為您的 ADO.NET 用戶端應用程式提供連接共用。您也可提供數個連接字串修飾詞 (Modifier) 來控制連接共用行為 (請參閱這個主題稍後的<使用連接字串關鍵字控制連接共用>章節)。

建立和設定共用

開啟連接時,會根據完全相符演算法,將共用關聯至連接內的連接字串以建立連接共用。每個連接共用都與不同的連接字串相關聯。開啟新連接後,如果連接字串不完全符合現有共用,便會建立新的共用。

下列範例中建立三個新 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 上呼叫 CloseDispose 時,會將連接釋放回共用。

**警告   **建議在使用了 Connection 之後都能將它關閉,這樣連接才能傳回至集區。您可以使用 Connection 物件的 CloseDispose 方法來進行這項作業。未明確關閉的連接也許會無法加入或傳回至集區。例如,如果已達到最大集區大小,而且連接仍為有效時,那麼已超出範圍但尚未明確關閉的連接將只會傳回至連接集區。

**注意   **請不要在類別的 Finalize 方法中,呼叫 ConnectionDataReader 或任何 Managed 物件上的 CloseDispose。在完成項中,只需釋放類別直接擁有的 Unmanaged 資源。如果類別未擁有任何 Unmanaged 資源,請不要在類別定義中包含 Finalize 方法。如需詳細資訊,請參閱記憶體回收的程式設計

移除連接

如果已超過連接的存留期 (Lifetime),或共用器偵測到與伺服器的連接已經中斷,連接共用器便會將共用中的連接移除。請注意,只有在嘗試與伺服器溝通後,才能偵測到這項狀態。如果發現連接已不再與伺服器連接,則它會被標示為無效。連接共用器會定期掃描連接共用,尋找已被釋放至共用且標示為無效的物件,然後這些連接會被永久移除。

如果存在的連接是連至已消失的伺服器,則即使連接共用器尚未偵測到中斷的連接且將其標示為無效,仍可能從共用中取得這個連接。發生這種情況時,會產生例外狀況,但是您還是必須將連接關閉,才能將它釋放回共用。

交易支援

連接是根據交易內容來從共用取得並指定的。要求執行緒的內容和指定連接必須相符;因此,每個連接共用實際上都細分為沒有與其關聯之交易內容的連接,以及每個連接共用包含與特定交易內容連接之 N 細分。

連接關閉後,會根據其交易內容發行回共用和適當的子共用;所以,即使分散式交易仍然暫止,您還是可以關閉連接,不用擔心產生錯誤。這項功能可讓您稍後認可或中止分散式交易。

使用連接字串關鍵字控制連接共用

QLConnection 物件的 ConnectionString 屬性支援可用於調整連接共用邏輯行為的連接字串索引鍵/值配對。

下列表格說明可用來調整連接共用行為的 ConnectionString 值。

名稱 Default 說明
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 # of pooled and non pooled connections 目前連接 (共用或非共用) 數目。
SqlClient: Current # pooled connections 與處理序相關的所有共用內的目前連接數目。
SqlClient: Current # connection pools 與處理序相關的目前共用數目。
SqlClient: Peak # pooled connections 處理序開始後,所有共用內最高的連接數目。注意:這個計數器只有與特定處理序執行個體 (Instance) 關聯時才可使用。_Global 執行個體一定會傳回 0。
SqlClient: Total # failed connects 因為任何原因而失敗的連接開啟嘗試總數。

**注意   **SQL Server .NET Framework 資料提供者效能計數器與 ASP.NET 應用程式搭配使用時,只提供 _Global 執行個體 (Instance)。因此,效能計數器所傳回的值是所有 ASP.NET 應用程式計數器值的總和。

請參閱

使用 ADO.NET 連接至資料來源 | 使用 .NET 資料提供者存取資料 | SqlConnection 類別