驅動程式管理員連線共用
連線共用可讓應用程式從連線集區使用連線,不需要針對每個用途重新建立連線。 連線一經建立並放置到集區後,應用程式即可重複使用該連線,無須執行完整的連線流程。
使用共用的連線可帶進極大的效能提升,因為應用程式可節省進行連線時產生的額外負荷。 這項效益對透過網路連線的中間層應用程式,以及反覆連線/中斷連線的應用程式 (例如網際網路應用程式) 來說尤為可觀。
除了效能提升,連線共用結構也能讓環境及與其相關聯的連線為單一流程中的多個元件所用。 換言之,相同流程中的獨立元件可彼此互動,但毋須得知彼此的存在。 連線集區中的連線可反覆為多個元件所用。
注意
連線共用可為展現 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 以前,系統仍不會確定所用的環境。
透過呼叫將InputHandle 設為 SQL_HANDLE_DBC 的 SQLAllocHandle,以配置連線,並將InputHandle 設為針對連線共用配置的環境環境控制代碼。 驅動程式管理員會嘗試在現有的環境中,尋找符合應用程式設定之環境屬性的對象。 如果找不到類似環境,則系統會建立一個環境,其參考計數 (由驅動程式管理員維護) 為 1。 如果找到符合的共用環境,該環境會傳回至應用程式,其參考計數則會遞增。 (系統必須呼叫 SQLConnect 或 SQLDriverConnect,驅動程式管理員才會決定實際使用的連線。)
呼叫 SQLConnect 或 SQLDriverConnect 建立連線。 驅動程式管理員會使用針對 SQLConnect 呼叫中的連線選項 (或針對 SQLDriverConnect 呼叫中的連線關鍵字),以及配置連線後設定的連線屬性,決定應該使用集區中的哪個連線。
注意
要求的連線與共用連線的配對方式,取決於 SQL_ATTR_CP_MATCH 環境屬性。 如需詳細資訊,請參閱 SQLSetEnvAttr。
使用連線共用的 ODBC 應用程式應在應用程式初始化期間呼叫 CoInitializeEx,並在應用程式關閉時呼叫 CoUninitialize。
不再需要連線時,請呼叫 SQLDisconnect。 該連線會傳回至連線集區,供其他對象重複使用。
如需深入討論,請參閱 Microsoft 資料存取元件的共用。
連線共用相關考量
使用 SQL 命令執行以下任何動作 (而非透過 ODBC API),都會影響連線的狀態,進而在連線共用作用期間導致意外問題:
開啟連線並變更預設資料庫。
使用 SET 陳述式變更任何可設定的選項 (包括 SET ROWCOUNT、ANSI_NULL、IMPLICIT_TRANSACTIONS、SHOWPLAN、STATISTICS、TEXTSIZE 和 DATEFORMAT)。
建立暫存資料表與預存程序。
假使任何這類動作未透過 ODBC API 執行,則下一個使用該連線的對象會自動繼承先前的設定、資料表或程序。
注意
請勿假設連線狀態會出現特定設定。 請一律在應用程式內設定連線狀態,並確定應用程式移除所有未使用的連線共用設定。
可感知驅動程式的連接共用
從 Windows 8 開始,ODBC 驅動程式可更有效率地在集區內使用連線。 如需詳細資訊,請參閱驅動程式感知連線共用。