連線池能讓應用程式從一組已存在的連線中取得所需連線,而不必每次重新建立連線。 一旦連線建立並放入池中,應用程式即可在不完成完整連線流程的情況下重複使用該連線。
使用池化連線可以帶來顯著的效能提升,因為應用程式可以節省建立連線所需的開銷。 這對於透過網路連接的中階應用程式,或是反覆連接與斷開的應用程式(如網際網路應用程式)尤其重要。
除了效能提升外,連線池架構還允許環境及其相關連線在單一程序中被多個元件使用。 這表示同一流程中的獨立元件可以在彼此不知情的情況下互動。 連接池中的一個連線可以被多個元件重複使用。
備註
連接池可用於具備 ODBC 2.x 行為的 ODBC 應用程式,只要應用程式能呼叫 SQLSetEnvAttr。 使用連線池時,應用程式不得執行會改變資料庫或資料庫上下文的 SQL 語句,例如更改 <資料庫名稱>,這會改變資料來源所使用的目錄。
ODBC 驅動程式必須完全支援多執行緒安全性,且連線不得有執行緒親和力以支援連線池技術。 這表示驅動程式能隨時處理任一執行緒的呼叫,並能在一個執行緒連接,使用另一個執行緒的連線,並在第三執行緒斷開連線。
連線池由驅動程式管理員維護。 當應用程式呼叫 SQLConnect 或 SQLDriverConnect 時,連線會從池中抽取,當應用程式呼叫 SQLDisConnect 時,連線會回傳回池。 池的規模會根據請求的資源分配動態成長。 它會根據不活躍逾時時間進行縮減:如果連線在一段時間內處於非活躍狀態(且未被使用),該連線會從連線池中移除。 池的大小僅受限於記憶體限制及伺服器的限制。
驅動程式管理器根據 SQLConnect 或 SQLDriverConnect 中傳遞的參數,以及連線分配後設定的連線屬性,決定池中特定連線是否應被使用。
當驅動程式管理員在合併連線時,它需要在分配連線前判斷連線是否仍在運作。 否則,驅動程式管理員在暫時性網路故障發生時,會持續將死連結交給應用程式。 在 ODBC 3*.x* 中定義了一個新的連接屬性:SQL_ATTR_CONNECTION_DEAD。 這是一個唯讀連線屬性,回傳 SQL_CD_TRUE 或 SQL_CD_FALSE。 SQL_CD_TRUE 的價值表示連線已經中斷,而 SQL_CD_FALSE 的值則表示連線仍然有效。 (符合早期 ODBC 版本的驅動程式也能支援此屬性。)
驅動程式必須有效實作此選項,否則會影響連線池的效能。 具體來說,調用以獲取此連線屬性不應該導致伺服器的來回通信。 相反地,驅動程式應該直接回傳連線的最後已知狀態。 如果最後一次連線失敗,連線就算死了;如果最後一次連線成功,連線就不會死。
備註
若連線中斷(透過 SQL_ATTR_CONNECTION_DEAD 回報),ODBC 驅動程式管理員會呼叫驅動程式中的 SQLDisconnect 來銷毀該連線。 新的連線請求可能在池中找不到可用的連線。 最終驅動管理員可能會建立新的連線,假設池子是空的。
要使用連線池,應用程式需執行以下步驟:
透過呼叫 SQLSetEnvAttr,將 SQL_ATTR_CONNECTION_POOLING 環境屬性設定為 SQL_CP_ONE_PER_DRIVER 或 SQL_CP_ONE_PER_HENV,以啟用連線池功能。 此呼叫必須在應用程式分配啟用連線池的共享環境之前完成。 在呼叫 SQLSetEnvAttr 時,環境句柄應該設為 null,這SQL_ATTR_CONNECTION_POOLING 就是一個程序層級屬性。 若屬性設為 SQL_CP_ONE_PER_DRIVER,則每個驅動程式支援單一連線池。 如果應用程式能同時支援多個驅動程式、少數環境,這可能會更有效率,因為需要比較的次數較少。 若設為 SQL_CP_ONE_PER_HENV,則每個環境支援單一連線池。 如果應用程式能同時支援多個環境但驅動程式較少,這可能更有效率,因為所需的比較次數較少。 連線池功能可透過將 SQL_ATTR_CONNECTION_POOLING 設為 SQL_CP_OFF 來停用。
透過呼叫 SQLAllocHandle 並將 HandleType 參數設為 SQL_HANDLE_ENV 來分配環境。 此呼叫所分配的環境將是隱含的共享環境,因為連線池已被啟用。 然而,要用什麼環境,直到在這個環境中呼叫帶有 HandleType 為 SQL_HANDLE_DBC 的 SQLAllocHandle 時,才會確定。
透過呼叫 SQLAllocHandle 並將 InputHandle 設為 SQL_HANDLE_DBC,並將 InputHandle 設為分配給連線池的環境 handle 來分配連線。 驅動程式管理器嘗試尋找符合應用程式設定環境屬性的現有環境。 若不存在此類環境,則建立一個環境,參考計數(由驅動程式管理器維護)為 1。 若找到匹配的共享環境,該環境會回傳給應用程式並增加其參考數量。 (實際使用的連線直到 SQLConnect 或 SQLDriverConnect 被呼叫時,驅動程式管理器才會判定。)
呼叫 SQLConnect 或 SQLDriverConnect 來建立連線。 驅動程式管理器會利用呼叫 SQLConnect 中的連線選項(或呼叫 SQLDriverConnect 中的連接關鍵字)以及連線分配後設定的連線屬性,來決定應使用池中哪個連線。
備註
請求的連線如何與池化連線匹配,由 SQL_ATTR_CP_MATCH 環境屬性決定。 欲了解更多資訊,請參閱 SQLSetEnvAttr。
使用 Connection Pooling 的 ODBC 應用程式應在應用程式初始化時呼叫 CoInitializeEx ,關閉時呼叫 CoUninitialize 。
連線完成後呼叫 SQLDisconnect 。 連線會被歸還到連線池,並可重複使用。
欲深入了解,請參閱 Microsoft 資料存取元件中的池化。
連線池考量
使用 SQL 指令執行以下任一動作(而非透過 ODBC API)都可能影響連線狀態,並在連線池啟用時引發意想不到的問題:
開啟連線並更改預設資料庫。
使用 SET 陳述式來更改任何可設定的選項(包括 SET ROWCOUNT、ANSI_NULL、IMPLICIT_TRANSACTIONS、SHOWPLAN、STATISTICS、TEXTSIZE 和 DATEFORMAT)。
建立暫存資料表與儲存程序。
若這些操作在 ODBC API 之外執行,下一位使用者將自動繼承先前的設定、資料表或程序。
備註
不要期待連線狀態會有某些設定。 你應該在應用程式中設定連線狀態,並確保應用程式移除所有未使用的連線池設定。
Driver-Aware 連線池化
從 Windows 8 開始,ODBC 驅動程式能更有效率地利用池中的連線。 如需詳細資訊,請參閱驅動程式感知連接共用。