ManagedConnection オブジェクトは、 常に DoesNotExist、InFreePool、または InUse の 3 つの状況のいずれかになっています。
接続は、作成される前は、必ず DoesNotExist 状況になっています。 接続は、作成後にアプリケーションに割り振られるかどうかによって、InUse または InFreePool のいずれかの状況になります。
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 | 接続はフリー・プールにあり、未使用のタイムアウト値を過ぎても使用されていません。 |
DoesNotExist
getConnection AND NOT(freeConnectionAvailable) AND poolSizeLTMax AND (NOT(shareableConnectionAvailable) OR unshareableConnectionRequest)
すべての接続は、DoesNotExist 状態で開始し、 アプリケーションが接続を要求した場合にのみ作成されます。 アプリケーションが新規接続を要求すると、プールの接続数が 0 から最大数に増えます。 サーバーの始動時に、プールは最小接続数では作成されません。
要求が共用可能接続に対するものであり、 同じ共用プロパティーを持つ接続がアプリケーションによってすでに使用されている場合、 接続は、2 つ以上の接続要求によって共用されます。 この場合、新規接続は作成されません。 JDBC API のユーザーの場合、 これらの共用プロパティーは、 たいていの場合、userid/password および transaction context ですが、 リソース・アダプターの Common Client Interface (CCI) のユーザーの場合は、 通常、ConnectionSpec、Subject、および transaction context になります。
InFreePool
InFreePool>InUse: getConnection AND freeConnectionAvailable AND (unshareableConnectionRequest OR NOT(shareableConnectionAvailable))
フリー・プールからの接続によって実現できる接続要求では、 データベースに対する新規接続は作成されません。 したがって、アプリケーションがいくつであっても、 アプリケーションがプールから一度に複数の接続を使用しない場合は、 プールがサイズよりも大きくなることはありません。 この数は、プールに指定された最小接続数より小さくなる場合もあります。 プールが最小接続数になるとすれば、 アプリケーションに複数の並行する接続要求があり、 その結果、新規接続を作成しなければならなくなる場合です。
InUse
InUse>InUse: getConnection AND ShareableConnectionAvailable
この遷移は、すでに使用されている接続として、アプリケーションが同じ共用プロパティーを持つ共用可能接続 (ShareableConnectionAvailable) を要求した場合 (getConnection)、既存の接続が共用されることを示します。
InUse>InFreePool: (close AND noOtherReferences AND NoTx AND UnshareableConnection) OR (ShareableConnection AND TxEnds)
アプリケーションが接続で close() を呼び出すと、 その接続は空き接続のプールに戻されます。 アプリケーションは、データ・ストアへの接続は閉じません。 アプリケーションが現在共用されている接続で close() を呼び出すと、 その接続はフリー・プールには戻されません。 接続がプールに戻されるのは、接続への最後の参照がアプリケーションによって除去され、 トランザクションが終了した後だけです。 共用不可能接続を使用しているアプリケーションは、 タイミングよく接続を閉じる必要があります。 これに失敗すると、接続プールに接続がなくなり、サーバー上で稼働するアプリケーションが接続を取得できなくなる可能性があります。
アプリケーションがトランザクションで確保される接続で close() を呼び出すと、 接続はフリー・プールには戻されません。 トランザクション・マネージャーは、接続オブジェクトへの参照も保持する必要があるため、 トランザクションが終了するまで、接続はフリー・プールに戻ることができません。 接続がいったんトランザクションで確保されると、 トランザクションが完了するまで、 他のどのアプリケーションも他のどのトランザクションにおいてもこの接続を使用することはできません。
InUse>DoesNotExist: close AND markedStale AND NoTx AND noOtherReferences
この遷移は、アプリケーションが接続で close() を呼び出し、 プールのクレンジング・ステップで接続が失効したとマークされると (markedStale)、 接続オブジェクトがデータ・ストアに対して閉じ、プールには戻されないことを示しています。
最後に、データ・ストアに対する接続を閉じて、 それらの接続をプールから除去できます。