WebSphere Application Server は、共用不可能 接続と共用可能 接続の両方をサポートしています。 共用不可能接続は、アプリケーション内の他のコンポーネントとは共用されません。 この接続を使用するコンポーネントが、この接続を完全に制御します。
共用不可能とマークされたリソースにアクセスすることは、コンポーネントが使用している接続ハンドルと、そのハンドルが関連付けられる物理接続との間に 1 対 1 の関係があることを意味します。このアクセスは、getConnection メソッド に対するすべての呼び出しが、要求側ユーザーのためだけに接続ハンドルを戻すということです。通常、接続を共用している別のアプリケーションに予期しない振る舞い (例えば、分離レベルの予期しない変更) が発生すると考えられる接続に対して操作を行う可能性がある場合は、「共用不可能」を選択しなければなりません。
リソースに共用可能とマークすると、スケーラビリティーが拡大されます。getConnection() 呼び出しのたびに物理接続を新規に作成するのではなく、各 getConnection 要求が同じ接続プロパティーを持っている限り、物理接続 (すなわち管理接続) が複数の接続ハンドルで共用されます。しかし、接続の共用とは、振る舞いを変更したり共用パートナーを混乱させるようなこと (例えば、分離レベルの変更など) を接続に対して行ってはならないということを意味します。また、特定の接続を共用するかどうかはランタイムによって決まるので、ユーザーは、共用が起きることを想定して、アプリケーションをコーディングすることもできません。
Java Message Service (JMS) 接続は、非 JMS 接続と共用することはできません。
すべての CMP Bean メソッドで同じアクセス・インテントを使用する場合は、 これらのすべてで同じ物理接続を共用します。 アクセス・インテント・ポリシーが異なると、 異なる物理接続の割り振りを起動します。 例えば、CMP Bean には 2 つのメソッドがあり、メソッド 1 は wsPessimisticUpdate インテントに関連付けられており、メソッド 2 には wsOptimisticUpdate アクセス・インテントがあるとします。 メソッド 1 とメソッド 2 は、 1 つのトランザクション内で同じ物理接続を共用できません。 つまり、グローバル・トランザクションで実行するには XA データ・ソースが必要になります。
両方のメソッドが同じテーブルにアクセスしようとする場合に、 データベースでデッドロックが起こる可能性があります。 したがって、 接続の共用は、CMP メソッドで定義されるアクセス・インテントによって決まります。
まず、BMP Bean と CMP Bean の両方の getConnection メソッドで、 同じ接続プロパティーが設定されていることを確認してください。 CMP Bean リソースの認証タイプを一致させるには、BMP Bean リソースの認証タイプを container-managed に設定します。 これは、デプロイメント記述子において res-auth = Container として 指定されます。
アクセス・インテントが CMP Bean メソッドで使用する分離レベルを決定してから、 リソース参照で指定された該当する分離レベルを使用して、 データ・ソースと接続を検索します。 詳しくは、 アクセス・インテント分離レベルおよび更新ロックならびに分離レベルおよびリソース参照を参照してください。
2 番目の取得 で戻された接続は、 最初の取得 で戻された接続と同じものです (同じプロパティーが使用される場合)。 接続は順次に使用されるため、基底となる物理接続に対する接続ハンドルは、一度に 1 つしか使用されません。そのため、実際に接続の共用が行われているわけではありません。「再利用」という表現を使用するほうが的確です。
さらに重要なことは、両方の取得 アクションを囲んでいる LocalTransactionContainment 境界は完了していません。cleanUp() メソッド呼び出しは ManagedConnection オブジェクトで発生しません。 このため、2 番目の取得 アクションは、 最初の getConnection() 呼び出し中に設定されたすべての接続プロパティーを継承します。
ただし、1 つのトランザクションの最中に接続に設定されたプロパティーは、 次のトランザクションで使用される場合に同じものである保証はありません。 共用の有効範囲外の接続を共用することは無効であるため、 トランザクションの終了時に、 接続ハンドルは、現在関連付けられている物理接続から取り除かれます。 その物理接続は、フリー接続プールに戻されます。 接続は除去されてから、フリー・プールに入れられます。 ハンドルは、次に使用される際に、該当する接続に自動的に関連付けられます。 該当する接続は、 セキュリティー・ログイン情報、接続プロパティー、 および拡張リソース参照に指定された分離レベル (JDBC API の場合) に基づいて決まり、 現行ハンドルを戻した元の要求に渡されます。 接続が検索されると、その接続に設定されていたプロパティーはすべて失われます。
ローカル・トランザクションの有効範囲でプロパティーを設定し、接続を共用する際は、注意が必要です。 接続を共用している他のコンポーネントは、 その設定の結果生じる振る舞いを予想していることを確認してください。
コンポーネントおよび J2C ランタイムの両方とも、管理対象の接続が共用不可能になるタイミングと状況に応じて、この SharingViolation 例外を検出する必要があります。接続ハンドルを介した操作が原因で管理対象の接続が共用不可能になった場合 (例えば、分離レベルを変更するなど)、コンポーネントは例外を処理する必要があります。管理対象接続が共用不可能となって、アプリケーション・サーバーによって認識されない場合は (コンポーネントが接続ハンドルと対話することによる)、リソース・アダプターは SharingViolation 例外を発行して、接続ハンドルの作成を拒否できます。