次の方法で共有


.NET Framework Data Provider for Oracle の接続プール

接続をプールすると、アプリケーションのパフォーマンスとスケーラビリティを大幅に改善できます。Oracle の .NET データ プロバイダは ADO.NET クライアント アプリケーションに自動的に接続プールを提供します。また、接続プール機能の動作を制御する接続文字列修飾子を指定することもできます (このトピックの後の「接続文字キーワードによる接続プールの制御」のセクションを参照してください)。

メモ   .NET Framework Data Provider for Oracle は、.NET Framework Version 1.0 には同梱されていません。.NET Framework Version 1.0 を使用していて、.NET Framework Data Provider for Oracle が必要な場合は、https://www.microsoft.com/downloads/search.asp?LangID=13&LangDIR=JA からダウンロードできます。

プールの作成と割り当て

接続が開かれると、厳密一致のアルゴリズムに基づいて接続プールが作成され、接続内の接続文字列に関連付けられます。各接続プールが別の接続文字列に関連付けられます。新しい接続が開かれたとき、接続文字列が既存のプールと厳密に一致しない場合は、新しいプールが作成されます。

接続プールは一度作成されるとアクティブなプロセスが終了するまで破棄されません。アクティブでないプールまたは空のプールを維持するためには、最小限のシステム オーバーヘッドが発生します。

接続の追加

一意の接続文字列ごとに 1 つの接続プールが作成されます。プールが作成された段階で、複数の接続オブジェクトが作成されてそのプールへ追加され、最小プール サイズ要件を満たします。必要に応じて、最大プール サイズに達するまで、接続がプールへ追加されます。

OracleConnection オブジェクトが要求されたとき、プールに使用可能な接続がある場合はプールから OracleConnection オブジェクトを取得します。使用可能な接続とは、サーバーへの有効なリンクを持つ接続のうち、現在使用中でないか、一致するトランザクション コンテキストを持っているか、またはどのトランザクション コンテキストにも関連付けられていない接続のことです。

最大プール サイズに達すると、使用可能な接続を取得できなくなり、要求はキューに置かれます。接続プーラーは、接続がプールに解放されたときに接続の再割り当てを行ってそれらの要求に応えます。Connection オブジェクトに対して Close メソッドまたは Dispose メソッドを呼び出すと、接続は解放され、プールに戻されます。

**注意   **接続がプールに返されるようにするために、接続を使い終えたら必ず Connection を終了することをお勧めします。これを行うには、Connection オブジェクトの Close メソッドまたは Dispose メソッドを使用します。明示的に終了されていない接続は、プールに追加したり返したりすることができないことがあります。たとえば、スコープ外に出ても、明示的に終了されていない接続は、最大プール サイズに達した時点でその接続がまだ有効である場合にだけ接続プールに返されます。

メモ   クラスの Finalize メソッド内で ConnectionDataReader、またはその他のマネージ オブジェクトの 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 に設定すると、接続が適切なプールから取り出されるか必要に応じて作成され、適切なプールに追加されます。

参照

ADO.NET でのデータ ソースへの接続 | .NET Framework データ プロバイダによるデータのアクセス | OracleConnection クラス