接続のライフサイクル
ManagedConnection オブジェクトは、 常に DoesNotExist、InFreePool、または InUse の 3 つの状況のいずれかになっています。
接続は、作成される前は、必ず DoesNotExist 状況になっています。 接続は、作成後にアプリケーションに割り振られるかどうかによって、InUse または InFreePool のいずれかの状況になります。
- アプリケーションでデータ・ソースまたは接続ファクトリー getConnection() メソッドを呼び出している (getConnection 状態)
- 一致するプロパティーを持つ、プール内の空き接続が使用可能である (freeConnectionAvailable 状態)
- さらに次の 2 つの条件のいずれかを満たしている
- getConnection() 要求が、共有不可能とマークされているリソース参照に代わるものである。
- getConnection() 要求は、共有可能とマークされているリソース参照に代わるものであるが、使用中の共有可能接続で同じプロパティーを持つものはない。
InFreePool > InUse: getConnection AND freeConnectionAvailable AND NOT(shareableConnectionAvailable)下記は、保護条件と説明についてのリストです。
条件 | 説明 |
---|---|
ageTimeoutExpired | 接続が ageTimeout 値を過ぎています。 |
close | アプリケーションは、Connection オブジェクトの close メソッドを呼び出します。 |
fatalErrorNotification | 接続に致命的エラーが生じました。 |
freeConnectionAvailable | 一致するプロパティーを持つ接続がフリー・プール内で使用可能です。 |
getConnection | アプリケーションは、データ・ソースまたは接続ファクトリー・オブジェクトで getConnection メソッドを呼び出します。 |
markedStale | 接続が失効とマークされています。これは通常、致命的エラー通知に応答して行われます。 |
noOtherReferences | 管理接続への接続ハンドルが 1 つしかなく、トランザクション・サービスが管理接続への参照を保持していません。 |
noTx | 強制されているトランザクションはありません。 |
poolSizeGTMin | 接続プールのサイズが最小のプール・サイズ (接続の最小数) より大きくなっています。 |
poolSizeLTMax | プール・サイズが最大プール・サイズ (接続の最大数) より小さくなっています。 |
shareableConnectionAvailable | この getConnection() 要求は共有可能接続に対するものです。一致するプロパティーを持つ接続は使用中で、かつ共有可能です。 |
TxEnds | トランザクションが終了しました。 |
unshareableConnectionRequest | この getConnection() 要求は、共有不可能接続に対するものです。 |
unusedTimeoutExpired | 接続はフリー・プールにあり、未使用のタイムアウト値を過ぎても使用されていません。 |
接続の取得
最初に説明する一連の遷移は、 アプリケーションがデータ・ソースまたは接続ファクトリーのいずれかから接続を要求する場合の遷移です。 一部のシナリオでは、結果として新たにデータベースに接続されることがあります。 また、シナリオによっては、接続が接続プールから検索されたり、 別の接続要求によって共有されたりする場合もあります。getConnection AND NOT(freeConnectionAvailable) AND poolSizeLTMax AND (NOT(shareableConnectionAvailable) OR unshareableConnectionRequest)
- アプリケーションがデータ・ソースまたは接続ファクトリーで getConnection() メソッドを呼び出す
- 使用可能な接続がフリー・プールにない (NOT(freeConnectionAvailable))
- プール・サイズが最大プール・サイズより小さい (poolSizeLTMax)
- 要求が共有可能接続に対するものであり、 同じ共有プロパティーを持つ、既に使用中の共有可能接続がない場合 (NOT(shareableConnectionAvailable))、 または、要求が共有不可能接続に対するものである場合 (unshareableConnectionRequest)
すべての接続は、DoesNotExist 状態で開始し、 アプリケーションが接続を要求した場合にのみ作成されます。 アプリケーションが新規接続を要求すると、プールの接続数が 0 から最大数に増えます。 サーバーの始動時に、プールは最小接続数では作成されません。
要求が共有可能接続に対するものであり、 同じ共有プロパティーを持つ接続がアプリケーションによって既に使用されている場合、 接続は、2 つ以上の接続要求によって共有されます。 この場合、新規接続は作成されません。 JDBC API のユーザーの場合、 これらの共有プロパティーは、 たいていの場合、userid/password および transaction context ですが、 リソース・アダプターの Common Client Interface (CCI) のユーザーの場合は、 通常、ConnectionSpec、Subject、および transaction context になります。
InFreePool>InUse: getConnection AND freeConnectionAvailable AND (unshareableConnectionRequest OR NOT(shareableConnectionAvailable))
- アプリケーションが getConnection() 呼び出しを実行済みである
- 接続プールの接続が使用可能である (freeConnectionAvailable)
- さらに次の 2 つの条件のいずれかを満たしている
- 要求が共有不可能接続に対するものである (unsharableConnectionRequest)
- 同じ共有プロパティーを持つ接続がトランザクションでまだ使用されていない (NOT(sharableConnectionAvailable))
フリー・プールからの接続によって実現できる接続要求では、 データベースに対する新規接続は作成されません。 したがって、アプリケーションがいくつであっても、 アプリケーションがプールから一度に複数の接続を使用しない場合は、 プールがサイズよりも大きくなることはありません。 この数は、プールに指定された最小接続数より小さくなる場合もあります。 プールが最小接続数になるとすれば、 アプリケーションに複数の並行する接続要求があり、 その結果、新規接続を作成しなければならなくなる場合です。
InUse>InUse: getConnection AND ShareableConnectionAvailable
この遷移は、既に使用されている接続として、アプリケーションが同じ共有プロパティーを持つ共有可能接続 (ShareableConnectionAvailable) を要求した場合 (getConnection)、既存の接続が共有されることを示します。
接続の戻り
これまでの遷移の説明はすべて、アプリケーションが使用する接続の取得についてでした。 これを行うため、遷移の結果、接続は閉じられ、フリー・プールに戻るか、または破棄されます。 アプリケーションは、接続オブジェクトで close() を呼び出すことによって、接続を明示的に閉じる必要があります (注: ユーザーが取り戻す接続は、実際には接続ハンドル)。 ほとんどの場合、この結果は次のような遷移になります。InUse>InFreePool: (close AND noOtherReferences AND NoTx AND UnshareableConnection) OR (ShareableConnection AND TxEnds)
- アプリケーションまたはコンテナー が close() を呼び出し (close 状態になる)、アプリケーション (アプリケーション共有状態) またはトランザクション・マネージャー (NoTx 状態。トランザクションで接続が確保されているときに、トランザクション・マネージャーが参照を保持する) のいずれも参照を行わない場合は (noOtherReferences)、フリー・プールに接続オブジェクトが戻されます。
- 接続をトランザクションで確保していたが、 トランザクション・マネージャーがトランザクションを終了し (txEnds 状態)、接続が共有可能接続であった場合 (ShareableConnection 状態)、接続は閉じられ、プールに戻されます。
アプリケーションが接続で close() を呼び出すと、 その接続は空き接続のプールに戻されます。 アプリケーションは、データ・ストアへの接続は閉じません。 アプリケーションが現在共有されている接続で close() を呼び出すと、 その接続はフリー・プールには戻されません。 接続がプールに戻されるのは、接続への最後の参照がアプリケーションによって除去され、 トランザクションが終了した後だけです。 共有不可能接続を使用しているアプリケーションは、 タイミングよく接続を閉じる必要があります。 これに失敗すると、接続プールに接続がなくなり、サーバー上で稼働するアプリケーションが接続を取得できなくなる可能性があります。
アプリケーションがトランザクションで確保される接続で close() を呼び出すと、 接続はフリー・プールには戻されません。 トランザクション・マネージャーは、接続オブジェクトへの参照も保持する必要があるため、 トランザクションが終了するまで、接続はフリー・プールに戻ることができません。 接続がいったんトランザクションで確保されると、 トランザクションが完了するまで、 他のどのアプリケーションも他のどのトランザクションにおいてもこの接続を使用することはできません。
InUse>DoesNotExist: close AND markedStale AND NoTx AND noOtherReferences
この遷移は、アプリケーションが接続で close() を呼び出し、 プールのクレンジング・ステップで接続が失効したとマークされると (markedStale)、 接続オブジェクトがデータ・ストアに対して閉じ、プールには戻されないことを示しています。
最後に、データ・ストアに対する接続を閉じて、 それらの接続をプールから除去できます。
- リソース・アダプター (またはデータ・ソース) から致命的エラーの通知を受け取った場合。 致命的エラーの通知 (FatalErrorNotification) は、 接続に何かが起こり、接続が使用できなくなったときに、リソース・アダプターから受け取ります。 現在フリー・プールにある接続は、すべて破棄されます。
- 接続が未使用タイムアウト時間より長くフリー・プール内にあり (UnusedTimeoutExpired) プール・サイズが最小接続数より大きい場合 (poolSizeGTMin)、 接続はフリー・プールから除去され、破棄されます。 このメカニズムにより、接続の要求が減少したときに、プールをその最小サイズに縮小して戻すことができます。
- 経過時間タイムアウトが構成され、与えられた接続の経過時間がタイムアウトより長い場合。 このメカニズムは、経過時間に基づいて接続をリサイクルする方法を提供します。