接続ハンドルは、物理接続を表現するものです。 WebSphere Application Server でバックエンド・リソース (リレーショナル・データベースなど) を使用するには、そのリソースへの接続を取得する必要があります。 getConnection() メソッドを呼び出すと、戻される接続ハンドル を受け取ります。 このハンドルは物理接続ではありません。 物理接続は接続マネージャーにより管理されます。
接続ハンドルの使用方法とその動作に影響を与える重要な 2 つの構成があります。1 番目は res-sharing-scope であり、 これは、データ・ソースまたは接続ファクトリーのルックアップに使用される resource-reference によって定義されます。 このプロパティーは、この接続が共用可能であるかどうかを接続マネージャーに知らせます。
次のコード・セグメントはキャッシュ接続パターンを示しています。
Connection conn = ds.getConnection(); ut.begin(); conn.prepareStatement("....."); --> Connection runs in global transaction mode ... ut.commit(); conn.prepareStatement("....."); ---> Connection still valid but runs in autoCommit(True); ...
同じシナリオでも、共用 接続を使用した場合、デッドロックは発生しません。この場合は、すべての作業が同じ接続上で行われたためです。 共用接続を使用するコードを作成するときに、複数の作業項目の呼び出しを同じ接続上 (できれば同じトランザクション内で) で実行する方針をとることが重要です。共用不可能接続を使用することにした場合は、 接続ファクトリーまたはデータ・ソースに maximum connections プロパティーを正しく設定する必要があります。 最大接続値を超え、接続待ちのタイムアウトを超過する前に共用不可能接続が閉じられないと、接続要求待ちに対して例外が発生する場合があります。
キャッシュされたハンドル・パターンを使用すると、そのハンドルが新しい共用有効範囲内で次に使用されるときに、現在の共用有効範囲に該当する管理対象接続にハンドルが再び関連付けられ、そのハンドルの最初の検索に使用されたものと同じプロパティーをハンドルが持つことが、アプリケーション・サーバー・ランタイムによって保証されます。 共用可能接続でプロパティーを変更することは適切ではないことを覚えておいてください。 プロパティーを変更すると、 同じ接続を共用する他のコンポーネントが予期しない動作をする可能性があります。 さらに、キャッシュされたハンドルを使用する場合、 変更したプロパティーの値は、共用有効範囲間では記憶されません。
すべてのリソース・アダプターにこの制限が適用されるわけではなく、特定の実装方法においてのみ適用されます。 Websphere リレーショナル・リソース・アダプター (RRA) にこの制限は適用されません。 RRA を介して使用されるデータ・ソースにはいずれもこの制限は適用されません。 この制限があるリソース・アダプターが見つかった場合は、 管理対象接続に対するアクセスをシリアライズすることで、 これに対処することができます。 別の接続ハンドルを取得する前に必ず接続ハンドルを閉じる場合 (または別のハンドルを取得するコードを呼び出す前にハンドルを閉じる)、メソッドから戻る前であれば、2 種類のコードによって同じ管理対象接続を共用することができます。 ただ、両方のイベントに対して、同時にこの接続を使用することはできません。
package javax.resource.spi; import javax.resource.ResourceException; interface LazyAssociatableConnectionManager { // application server void associateConnection( Object connection, ManagedConnectionFactory mcf, ConnectionRequestInfo info) throws ResourceException; } interface DissociatableManagedConnection { // resource adapter void dissociateConnections() throws ResourceException; }
DissociatableManagedConnection インターフェースは、Connection オブジェクトにもう 1 つの状態である非アクティブ を導入します。これで、Connection は、アクティブ、クローズ、および非アクティブの状態を持つようになりました。接続オブジェクトは、対応する ManagedConnection オブジェクトがクリーンアップされると、非アクティブ状態になります。接続は、アプリケーション・コンポーネントが接続の再使用を試みるまで、非アクティブとなります。リソース・アダプターは接続マネージャーを呼び戻して、接続をアクティブな ManagedConnection オブジェクトに再度関連付けます。