3.14.3 コネクションシェアリング・アソシエーション
コネクションシェアリングとコネクションアソシエーションは,コネクション共有機能です。コネクション共有機能を利用することで,リソースを効率的に使用し,パフォーマンスを向上できます。必要に応じて,コネクションアソシエーション機能を有効にしてください。
ローカルトランザクションでトランザクション管理を行っている場合,一つのリソースコネクションだけでデータベースなどのリソースにアクセスする必要があります。コネクション共有機能を使用するとユーザアプリケーションで意識することなく,一つのリソースコネクションだけでリソースアクセスができます。
グローバルトランザクションの場合も同様に,一つのリソースコネクションしかトランザクションに参加しない場合は,1フェーズコミットに最適化されるため,トランザクションの決着コストを下げることができます。
(1) 物理コネクションと論理コネクション
物理コネクションとは,接続先リソースのコネクションを指します。通常,サーブレットやEnterprise BeanなどのJ2EEコンポーネントが直接操作することはなく,コンテナが操作します。例えば,リソースアダプタの場合はManagedConnection(javax.resource.spi.ManagedConnection)です。
論理コネクションとは,サーブレットやEnterprise BeanなどのJ2EEコンポーネントが直接操作するコネクションを指します。例えば,リソースアダプタの場合はjavax.resource.cci.Connectionやリソースアダプタが独自に提供するコネクションです。
物理コネクションと論理コネクションの関係は,一般的に,物理コネクションから論理コネクションを生成するという関係になります。物理コネクションはコネクションプールで管理され,コネクションプールが物理コネクションの取得およびクローズを行います。
サーブレットやEnterprise BeanなどのJ2EEコンポーネントからのコネクション取得要求に対しては,コネクションプールが物理コネクションから論理コネクションを生成して返却します。コネクション解放要求に対しては,論理コネクションだけをクローズし,物理コネクションはクローズしないでプール管理します。
(2) コネクションシェアリング
コネクションアソシエーション機能が有効でない場合,アプリケーションサーバが管理するトランザクション内でコネクションシェアリングが行われます。トランザクション内コネクションシェアリングは,リソースコネクションを最も効率的に使用します。トランザクション内のコネクションシェアリングについて次の図に示します。
コネクションアソシエーション機能が有効な場合,およびアプリケーションサーバが管理するトランザクションの外でのコネクションシェアリングは,サーブレットやEnterprise BeanなどのJ2EEコンポーネントインスタンス内でコネクションシェアリングが行われます。コンポーネント内のコネクションシェアリングについて,次の図に示します。
(a) コネクションシェアリングの条件
コネクションシェアリングをするためには,次の条件をすべて満たす必要があります。
-
同一のJ2EEサーバ内であること
-
同一のリソースであること
-
サインオンの方法とセキュリティ情報(ユーザ名とパスワード)が同じであること
-
標準DDの<res-sharing-scope>にShareableが指定されていること
-
同一のアプリケーションサーバが管理するトランザクション内であること※
- 注※
-
アプリケーションサーバが管理するトランザクションの外でもコネクションシェアリングを行うことができます。
アプリケーションサーバが管理するトランザクションの外でコネクションシェアリングを有効にする場合は,J2EEサーバのプロパティをカスタマイズして設定します。J2EEサーバの動作設定のカスタマイズについては,「3.14.10 実行環境での設定」を参照してください。
なお,リソースアダプタのトランザクションサポートレベルにNoTransactionを指定した場合は,コネクションシェアリングは行われません。
なお,コネクションシェアリングの定義については,「3.14.9 cosminexus.xmlでの定義」を参照してください。
(b) コネクションシェアリングの定義
コネクションを共有するかどうかは,サーブレットやEnterprise Beanの標準DDまたはcosminexus.xmlの<res-sharing-scope>タグで指定します。リソース参照ごとに指定できます。コネクションの共有はデフォルトで有効になっています。無効にする場合は,<res-sharing-scope>にUnshareableを指定します。
J2EEアプリケーションの設定については,「3.14.9 cosminexus.xmlでの定義」を参照してください。
(c) 注意事項
java.sql.Connectionを,複数のトランザクション間で再利用することはできません。
java.sql.Connectionをトランザクション内で利用する場合には,トランザクションごとに,javax.sql.DataSourceからgetConnection()メソッドを使用してコネクションを取得してください。
なお,java.sql.Connectionは,トランザクション内とトランザクション外との間でも再利用することはできません。
(3) コネクションアソシエーション
トランザクション範囲を超えた永続性を持つコネクションを使用する場合,トランザクション内コネクションシェアリングを使用できません。その場合は,コネクションアソシエーション機能を有効にしてください。
コネクションアソシエーションは,論理コネクションと物理コネクションの関係を切り替えて,一つのリソースコネクションによるリソースアクセスを実現します。
(a) コネクションアソシエーションの条件
コネクションアソシエーションをするためには,次の条件のすべてを満たす必要があります。
-
コネクションアソシエーション機能が有効であること
-
同一のJ2EEサーバ内であること
-
同一のリソースであること
-
サインオンの方法とセキュリティ情報(ユーザ名とパスワード)が同じであること
-
標準DDの<res-sharing-scope>にShareableが指定されていること※
-
同一のアプリケーションサーバが管理するトランザクション内であること
- 注※
-
usrconf.propertiesのejbserver.connectionpool.association.enabledDespiteUnshareableSettingキーに「true」を設定すると標準DDの<res-sharing-scope>にUnshareableが指定されていてもコネクションアソシエーションを行います。
このプロパティは下位互換性のためだけに提供されています。
(b) コネクションアソシエーションの定義
コネクションアソシエーションはデフォルトで無効になっています。
コネクションアソシエーションを有効にするための設定は,J2EEサーバのプロパティをカスタマイズして設定します。J2EEサーバの動作設定のカスタマイズについては,「3.14.10 実行環境での設定」を参照してください。
(c) 注意事項
java.sql.Connectionからの生成物(例:java.sql.Statement)をトランザクションの範囲を超えて使用することはできません。