Cosminexus 機能解説

[目次][用語][索引][前へ][次へ]

9.10.2 コネクションシェアリング・アソシエーション

コネクションシェアリングとコネクションアソシエーションは,コネクション共有機能です。コネクション共有機能を利用することで,リソースを効率的に使用し,パフォーマンスを向上できます。必要に応じて,コネクションアソシエーション機能を有効にしてください。

ローカルトランザクションでトランザクション管理を行っている場合,一つのリソースコネクションだけでデータベースなどのリソースにアクセスする必要があります。コネクション共有機能を使用するとユーザアプリケーションで意識することなく,一つのリソースコネクションだけでリソースアクセスができます。

グローバルトランザクションの場合も同様に,一つのリソースコネクションしかトランザクションに参加しない場合は,1フェーズコミットに最適化されるため,トランザクションの決着コストを下げることができます。

<この項の構成>
(1) 物理コネクションと論理コネクション
(2) コネクションシェアリング
(3) コネクションアソシエーション

(1) 物理コネクションと論理コネクション

物理コネクションとは,接続先リソースのコネクションを指します。通常,サーブレットやEnterprise BeanなどのJ2EEコンポーネントが直接操作することはなく,コンテナが操作します。例えば,リソースアダプタの場合はManagedConnection(javax.resource.spi.ManagedConnection)です。

論理コネクションとは,サーブレットやEnterprise BeanなどのJ2EEコンポーネントが直接操作するコネクションを指します。例えば,リソースアダプタの場合はjavax.resource.cci.Connectionやリソースアダプタが独自に提供するコネクションです。

物理コネクションと論理コネクションの関係は,一般的に,物理コネクションから論理コネクションを生成するという関係になります。物理コネクションはコネクションプールで管理され,コネクションプールが物理コネクションの取得およびクローズを行います。

サーブレットやEnterprise BeanなどのJ2EEコンポーネントからのコネクション取得要求に対しては,コネクションプールが物理コネクションから論理コネクションを生成して返却します。コネクション解放要求に対しては,論理コネクションだけをクローズし,物理コネクションはクローズしないでプール管理します。

(2) コネクションシェアリング

コネクションアソシエーション機能が有効でない場合,Application Serverが管理するトランザクション内でコネクションシェアリングが行われます。トランザクション内コネクションシェアリングは,リソースコネクションを最も効率的に使用します。トランザクション内のコネクションシェアリングについて次の図に示します。

図9-15 論理コネクションと物理コネクションの関係(トランザクション内コネクションシェアリング)

[図データ]

コネクションアソシエーション機能が有効な場合,およびApplication Serverが管理するトランザクションの外でのコネクションシェアリングは,サーブレットやEnterprise BeanなどのJ2EEコンポーネントインスタンス内でコネクションシェアリングが行われます。コンポーネント内のコネクションシェアリングについて,次の図に示します。

図9-16 論理コネクションと物理コネクションの関係(コンポーネント内コネクションシェアリング)

[図データ]

(a) コネクションシェアリングの条件

コネクションシェアリングをするためには,次の条件をすべて満たす必要があります。

(b) コネクションシェアリングの定義

コネクションを共有するかどうかは,サーブレットやEnterprise Beanの標準DDの<res-sharing-scope>タグで指定します。リソース参照ごとに指定できます。コネクションの共有はデフォルトで有効になっています。無効にする場合は,<res-sharing-scope>にUnshareableを指定します。

コネクションシェアリングの設定は,J2EEアプリケーションに含まれるSession Bean.,Entity Bean,Message-driven BeanまたはWARの属性(プロパティ)として設定します。J2EEアプリケーションの設定については,マニュアル「Cosminexus システム構築ガイド」を参照してください。

(c) 注意事項

java.sql.Connectionを,複数のトランザクション間で再利用することはできません。

java.sql.Connectionをトランザクション内で利用する場合には,トランザクションごとに,javax.sql.DataSourceからgetConnection()メソッドを使用してコネクションを取得してください。

なお,java.sql.Connectionは,トランザクション内とトランザクション外との間でも再利用することはできません。

(3) コネクションアソシエーション

トランザクション範囲を超えた永続性を持つコネクションを使用する場合,トランザクション内コネクションシェアリングを使用できません。その場合は,コネクションアソシエーション機能を有効にしてください。

コネクションアソシエーションは,論理コネクションと物理コネクションの関係を切り替えて,一つのリソースコネクションによるリソースアクセスを実現します。

図9-17 論理コネクションと物理コネクションの関係(コネクションアソシエーション)

[図データ]

図9-18 論理コネクションと物理コネクションの関係(コネクションアソシエーションとコネクションシェアリングの併用時)

[図データ]

(a) コネクションアソシエーションの条件

コネクションアソシエーションをするためには,次の条件のすべてを満たす必要があります。

(b) コネクションアソシエーションの定義

コネクションアソシエーションはデフォルトで無効になっています。

コネクションアソシエーションを有効にするための設定は,J2EEサーバのプロパティをカスタマイズして設定します。J2EEサーバの動作設定のカスタマイズについては,マニュアル「Cosminexus システム構築ガイド」を参照してください。

また,コネクションを共有するかどうかは,サーブレットやEnterprise Beanの標準DDの<res-sharing-scope>タグで指定します。リソース参照ごとに指定できます。コネクションの共有はデフォルトで有効になっています。無効にする場合は,<res-sharing-scope>にUnshareableを指定します。

コネクションシェアリングの設定は,J2EEアプリケーションに含まれるSession Bean.,Entity Bean,Message-driven BeanまたはWARの属性(プロパティ)として設定します。J2EEアプリケーションの設定については,マニュアル「Cosminexus システム構築ガイド」を参照してください。

(c) 注意事項

java.sql.Connectionからの生成物(例:java.sql.Statement)をトランザクションの範囲を超えて使用することはできません。