OLE DB、ODBC、および Oracle 接続プール (ADO.NET)
更新 : November 2007
接続をプールすると、アプリケーションのパフォーマンスとスケーラビリティを大幅に改善できます。このセクションでは、OLE DB、ODBC、および Oracle 用の .NET Framework データ プロバイダの接続プールについて説明します。
OleDb の接続プール
.NET Framework Data Provider for OLE DB は、OLE DB セッションのプール機能を使用して接続を自動的にプールします。接続文字列引数を使用して、プール機能を含む OLE DB サービスの有効や無効を切り替えることができます。たとえば、次の接続文字列は OLE DB セッション プール機能と自動的なトランザクションへの参加を無効にします。
Provider=SQLOLEDB;OLE DB Services=-4;Data Source=localhost;Integrated Security=SSPI;
接続がプールに返されるようにするために、接続を使い終えたら必ず接続を終了または破棄することをお勧めします。明示的に終了されていない接続は、プールに返されない場合があります。たとえば、スコープ外に出ても、明示的に終了されていない接続は、最大プール サイズに達した時点でその接続がまだ有効である場合にだけ接続プールに返されます。
OLE DB セッション プール機能とリソース プール機能の説明、および OLE DB プロバイダ サービスの既定値をオーバーライドしてプール機能を無効にする方法については、MSDN ライブラリにある OLE DB プログラマ ガイドを参照してください。
Odbc の接続プール
.NET Framework Data Provider for ODBC の接続プールは、接続に使用される ODBC ドライバ マネージャによって管理されるため、.NET Framework Data Provider for ODBC の影響は受けません。
接続プール機能を有効または無効にするには、[コントロール パネル] の [管理ツール] フォルダにある [ODBC データ ソース アドミニストレータ] を開きます。[接続プール] タブで、インストールされている各 ODBC ドライバに対する接続プール パラメータを指定できます。ODBC ドライバの接続プールを変更すると、その ODBC ドライバを使用するすべてのアプリケーションに影響します。
ODBC 接続プールの詳細については、MSDN ライブラリにある「INFO: ODBC 接続プーリングについてよく寄せられた質問」を参照してください。
OracleClient の接続プール
Oracle の .NET データ プロバイダは ADO.NET クライアント アプリケーションに自動的に接続プールを提供します。また、接続プール機能の動作を制御する接続文字列修飾子を指定することもできます (このトピックの後の「接続文字列キーワードによる接続プールの制御」を参照してください)。
プールの作成と割り当て
接続が開かれると、厳密一致のアルゴリズムに基づいて接続プールが作成され、接続内の接続文字列に関連付けられます。各接続プールが別の接続文字列に関連付けられます。新しい接続が開かれたとき、接続文字列が既存のプールと厳密に一致しない場合は、新しいプールが作成されます。
接続プールは一度作成されるとアクティブなプロセスが終了するまで破棄されません。アクティブでないプールまたは空のプールの維持には、システム リソースはほとんど使用されません。
接続の追加
一意の接続文字列ごとに 1 つの接続プールが作成されます。プールが作成された段階で、複数の接続オブジェクトが作成されてそのプールへ追加され、最小プール サイズ要件を満たします。必要に応じて、最大プール サイズに達するまで、接続がプールへ追加されます。
OracleConnection オブジェクトが要求されたとき、プールに使用可能な接続がある場合はプールから取得されます。使用可能な接続とは、サーバーへの有効なリンクを持つ接続のうち、現在使用中でないか、一致するトランザクション コンテキストを持っているか、またはどのトランザクション コンテキストにも関連付けられていない接続のことです。
最大プール サイズに達すると、使用可能な接続を取得できなくなり、要求はキューに置かれます。接続プーラーは、接続がプールに解放されたときに接続の再割り当てを行ってそれらの要求に応えます。接続が終了または破棄されると、その接続は解放され、プールに戻されます。
接続の削除
接続が長時間アイドル状態のとき、またはサーバーとの接続が切断されているのを検出したときに、接続プーラーはプールから接続を削除します。この作業を実行できるのは、サーバーとの通信を試みた後だけです。接続がサーバーに接続していないことがわかると、その接続は無効としてマークされます。接続プーラーは、定期的に接続プールをスキャンし、プールから解放して無効としてマークするオブジェクトを検索します。その後、それらの接続は永久に削除されます。
既に存在しないサーバーへの接続が存在する場合は、接続プーラーが、その接続が切断されていることをまだ検出せず、無効というマークを付けていない状況のときに、プールからその接続を削除できます。このような状況が発生したときは、例外が生成されます。ただし、その場合も開発者は接続を終了して解放し、プールへ返す必要があります。
クラスの Finalize メソッド内で Connection、DataReader、またはその他のマネージ オブジェクトの Close または Dispose を呼び出さないでください。終了処理では、クラスに直接所有されているアンマネージ リソースだけを解放してください。クラスがアンマネージ リソースを所有していない場合は、クラス定義に Finalize メソッドを含めないでください。詳細については、「ガベージ コレクション」を参照してください。
トランザクションのサポート
接続はプールから取り出され、トランザクション コンテキストに基づいて割り当てられます。要求スレッドのコンテキストと割り当てられた接続は一致している必要があります。したがって、各接続プールは、実際にはトランザクション コンテキストに関連付けられていない接続の部分と、それぞれが特定のトランザクション コンテキストに関連付けられている接続を含む N 個の部分に分かれています。
接続が終了すると、その接続は解放されてプールへ返り、さらに、そのトランザクション コンテキストに基づいて特定のサブプールへ返ります。そのため、分散トランザクションが保留状態である場合を含め、エラーを発生させることなく、開発者が接続を終了させることは可能です。これにより、分散トランザクションを後でコミットまたはアボートできます。
接続文字列キーワードによる接続プールの制御
OracleConnection オブジェクトの ConnectionString プロパティは、接続プール ロジックの動作を調整するために使用できる接続文字列キーおよび値のペアをサポートします。
接続プールの動作を調整するための ConnectionString 値についての説明を次の表に示します。
名前 |
既定値 |
説明 |
---|---|---|
Connection Lifetime |
0 |
接続がプールに返された時点で、その接続の作成時刻と現在の時刻を比較し、その時間の長さ (秒) が Connection Lifetime で指定した値を超えている場合は、その接続が破棄されます。これは、クラスタ構成を採用している状況で、実行中のサーバーと、オンラインになったばかりのサーバーの間での、負荷を強制的に分散するのに便利です。 値ゼロ (0) を指定した場合は、プールされている接続に、最大のタイムアウトが割り当てられます。 |
Enlist |
'true' |
true に設定すると、トランザクション コンテキストが存在する場合、プーラーは自動的に、作成スレッドの現在のトランザクション コンテキストの中に、その接続を参加させます。 |
Max Pool Size |
100 |
プールに格納できる最大接続数。 |
Min Pool Size |
0 |
プールで維持できる最小接続数。 |
Pooling |
'true' |
true に設定すると、接続が適切なプールから取り出されるか、または必要に応じて作成され、適切なプールに追加されます。 |