ドライバー マネージャーの接続プール

接続プールを使用すると、アプリは、使用ごとに再確立する必要のない接続のプールからの接続を使用できます。 接続が作成されてプールに配置されると、アプリは完全な接続プロセスを実行せずにその接続を再利用できます。

プールされた接続を使用すると、アプリが接続に関連するオーバーヘッドを節約できるため、パフォーマンスが大幅に向上する可能性があります。 これは、ネットワーク経由で接続する中間層アプリや、インターネット アプリなど、接続と切断を繰り返し行うアプリの場合に特に重要です。

接続プール アーキテクチャでは、パフォーマンスの向上に加えて、環境とそれに関連付けられている接続を 1 つのプロセスで複数のコンポーネントで使用できます。 つまり、同じプロセス内のスタンドアロン コンポーネントは、互いに認識しなくても相互にやり取りできます。 接続プール内の接続は、複数のコンポーネントで繰り返し使用できます。

Note

アプリが SQLSetEnvAttr を呼び出すことができる限り、接続プールは、ODBC 2.x の動作を示す ODBC アプリで使用できます。 接続プールを使用する場合、アプリは、データベースまたはデータベースのコンテキストを変更する SQL ステートメント (<データベース名>の変更など) を実行してはなりません。データ ソースで使用されるカタログが変更されるからです。

ODBC ドライバーは完全にスレッド セーフである必要があり、接続プールをサポートするためのスレッド アフィニティを持つ必要はありません。 つまり、ドライバーはいつでも任意のスレッドの呼び出しを処理でき、1 つのスレッドで接続したり、別のスレッドで接続を使用したり、3 番目のスレッドで切断したりできます。

接続プールは、ドライバー マネージャーによって管理されます。 接続は、アプリが 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 を呼び出すことによって、その接続を破棄します。 新しい接続要求では、プール内で使用可能な接続が見つからない場合があります。 最終的に、ドライバー マネージャーは、プールが空であると仮定して、新しい接続を行う可能性があります。

接続プールを使用するには、アプリで次の手順を実行します。

  1. 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 に設定されている場合は、ドライバーごとに 1 つの接続プールがサポートされます。 アプリが多くのドライバーと少数の環境で動作する場合は、必要な比較が少なくなるため、効率が高くなる可能性があります。 SQL_CP_ONE_PER_HENVに設定すると、環境ごとに 1 つの接続プールがサポートされます。 アプリが多くの環境で動作し、ドライバーが少ない場合は、必要な比較が少なくなるため、効率が高くなる可能性があります。 SQL_ATTR_CONNECTION_POOLINGを SQL_CP_OFF に設定すると、接続プールが無効になります。

  2. HandleType 引数を SQL_HANDLE_ENV に設定して SQLAllocHandle を呼び出して環境を割り当てます。 接続プールが有効になっているため、この呼び出しによって割り当てられる環境は暗黙的な共有環境になります。 ただし、使用する環境は、SQL_HANDLE_DBCの HandleType を持つ SQLAllocHandle がこの環境で呼び出されるまで決定されません。

  3. InputHandle が SQL_HANDLE_DBC に設定され、InputHandle が接続プール用に割り当てられた環境ハンドルに設定された SQLAllocHandle を呼び出して接続を割り当てます。 ドライバー マネージャーは、アプリによって設定された環境属性に一致する既存の環境を検索しようとします。 このような環境が存在しない場合は、参照カウント (ドライバー マネージャーによって管理) が 1 で作成されます。 一致する共有環境が見つかった場合は、環境がアプリに返され、その参照カウントがインクリメントされます。 (使用する実際の接続は、ドライバー マネージャーによって決定されません。SQLConnect または SQLDriverConnect が呼び出されます)。

  4. SQLConnect または SQLDriverConnect を呼び出して接続を確立します。 ドライバー マネージャーは、SQLConnect の呼び出しの接続オプション (または SQLDriverConnect の呼び出しの接続キーワード) と接続の割り当て後に設定された接続属性を使用して、プール内のどの接続を使用するかを決定します。

    Note

    要求された接続がプールされた接続と一致する方法は、SQL_ATTR_CP_MATCH環境属性によって決まります。 詳細については、「SQLSetEnvAttr」を参照してください。

    接続プールを使用する ODBC アプリでは、アプリの初期化中に CoInitializeEx を呼び出し、アプリが閉じるときに CoUninitialize を呼び出す必要があります。

  5. 接続が完了したら、SQLDisconnect を呼び出します。 接続が接続プールに返され、再利用できるようになります。

詳細については、「Microsoft Data Access Componentsのプール」を参照してください。

接続プールに関する考慮事項

(ODBC API を介してではなく) SQL コマンドを使用して次のいずれかのアクションを実行すると、接続の状態に影響し、接続プールがアクティブな場合に予期しない問題が発生する可能性があります。

  • 接続を開き、既定のデータベースを変更します。

  • SET ステートメントを使用して構成可能なオプション (SET ROWCOUNT、ANSI_NULL、IMPLICIT_TRANSACTIONS、SHOWPLAN、STATISTICS、TEXTSIZE、DATEFORMAT など) を変更します。

  • 一時テーブルとストアド プロシージャの作成。

これらのアクションのいずれかが ODBC API の外部で実行された場合、接続を使用する次のユーザーは、以前の設定、テーブル、またはプロシージャを自動的に継承します。

Note

特定の設定が接続状態になることは想定しないでください。 常にアプリで接続状態を設定し、使用されていない接続プール設定がアプリによって削除されるようにする必要があります。

ドライバー対応接続プール

Windows 8 以降では、ODBC ドライバーはプール内の接続をより効率的に使用できます。 詳細については、「ドライバー対応接続プール」に関するページを参照してください。

参照

データ ソースまたはドライバーへの接続
ODBC ドライバーの開発
Microsoft Data Access Components でのプール