9.3.3 データソースによるデータベースへの接続で使用できる機能
(1) サインオン
データソースを利用した場合,サインオンの方式として,コンテナ管理のサインオンとコンポーネント管理のサインオンの両方を使用できます。ただし,コンポーネント管理でのサインオンの場合,トランザクションの種類によって使用が制限されます。
- コンテナ管理でのサインオンの場合
- コンテナ管理でのサインオンの場合には,データソースで設定したユーザ名とパスワードを使ってデータベースにアクセスします。
- コンポーネント管理でのサインオンの場合
- データベースへのアクセスはgetConnectionメソッドで渡されたユーザ名とパスワードを使ってデータベースにアクセスします。
(2) コネクション管理
データベースの接続情報は,データソースを介してJ2EEサーバで管理され,コネクションプールにプーリングされます。
(3) トランザクション管理
ローカルトランザクションでトランザクション管理されます。
トランザクションについては,マニュアル「Cosminexus アプリケーションサーバ 機能解説 基本・開発編(コンテナ共通機能)」の「3.4 トランザクション管理」を参照してください。
(4) オブジェクトの自動クローズ
データソースは,ユーザハンドル(java.sql.Connection)から生成された,Statementオブジェクト,PreparedStatementオブジェクト,CallableStatementオブジェクト,および各種ステートメントやDatabaseMetaDataから生成されたResultSetオブジェクトを自動クローズできます。
(5) パフォーマンスチューニングのための機能
ベーシックモードでデータベースに接続する場合に,パフォーマンスチューニングのために使用できる機能を,次の表に示します。
表9-22 ベーシックモードでデータベースに接続する場合に使用できるパフォーマンスチューニングのための機能
機能 | 使用可否 | 機能差※1 |
---|
コネクションプーリング | ○ | あり |
コネクションシェアリング | ○※2 | なし |
コネクションのアソシエーション | × | - |
ステートメントプーリング | × | - |
ライトトランザクション | × | - |
インプロセストランザクションサービス | × | - |
DataSourceオブジェクトのキャッシング | ○ | なし |
DB Connectorのコンテナ管理でのサインオンの最適化 | × | - |
受信バッファのプーリング | × | - |
(凡例)○:使用できる ×:使用できない -:該当しない
注※1 1.4モードとの機能差の有無です。
注※2 ベーシックモードでコネクションシェアリング機能を利用するには,コネクションプーリング機能を利用する必要があります。なお,標準DDの<res-sharing-scope>にUnshareableを指定してもコネクションシェアリングは有効です。
以降,ベーシックモードで使用できるパフォーマンスチューニングのための機能について説明します。なお,それぞれの機能の概要および目的については,次の個所を参照してください。
- マニュアル「Cosminexus アプリケーションサーバ 機能解説 基本・開発編(コンテナ共通機能)」の「3.14 パフォーマンスチューニングのための機能」
- マニュアル「Cosminexus アプリケーションサーバ 機能解説 基本・開発編(コンテナ共通機能)」の「3.14.1 コネクションプーリング」
- マニュアル「Cosminexus アプリケーションサーバ 機能解説 基本・開発編(コンテナ共通機能)」の「3.14.2 コネクションプーリングで使用できる機能」
- マニュアル「Cosminexus アプリケーションサーバ 機能解説 基本・開発編(コンテナ共通機能)」の「3.14.3 コネクションシェアリング・アソシエーション」
- マニュアル「Cosminexus アプリケーションサーバ 機能解説 基本・開発編(コンテナ共通機能)」の「3.14.4 ステートメントプーリング」
- マニュアル「Cosminexus アプリケーションサーバ 機能解説 基本・開発編(コンテナ共通機能)」の「3.14.5 ライトトランザクション」
- マニュアル「Cosminexus アプリケーションサーバ 機能解説 基本・開発編(コンテナ共通機能)」の「3.14.6 インプロセストランザクションサービス」
- マニュアル「Cosminexus アプリケーションサーバ 機能解説 基本・開発編(コンテナ共通機能)」の「3.14.7 DataSourceオブジェクトのキャッシング」
- マニュアル「Cosminexus アプリケーションサーバ 機能解説 基本・開発編(コンテナ共通機能)」の「3.14.8 DB Connectorのコンテナ管理でのサインオンの最適化」
- このマニュアルの「11.4 受信バッファのプーリングの設定」
ここでは,ベーシックモードで特有の内容についてだけ説明します。
- コネクションプーリング
- J2EEサーバでは,JDBCデータソースごとにプールを作成して管理します。JDBCデータソースに最大値,最小値,増加,しきい値などを指定することで,プーリングの動作をカスタマイズできます。
- J2EEコンポーネントがJDBCデータソースからJDBCコネクションを取得したとき,最小値分のJDBCコネクションが生成されプーリングされます。また,JDBCコネクションは最大値分までプーリングされます。プール中の未使用JDBCコネクションの数がしきい値分以下になったとき,新たに増加分のJDBCコネクションを取得してプールに補充します。プーリングされるJDBCコネクションの数は,J2EEコンポーネントからのデータベースアクセス量に応じて,最大値と最小値の間になります。
- なお,JDBCコネクションプーリングは,同一JDBCデータソースに対して,引数なしのgetConnection()メソッドと引数ありのgetConnection(java.lang.String username,java.lang.String password)メソッド間では,別のプールになります。
- また,引数ありのgetConnection(java.lang.String username,java.lang.String password)メソッド間でusernameが異なる場合,別のプールになります。なお,J2EEサーバ間のJDBCコネクションプーリングは,サポートしていません。
- コネクションシェアリング
- 1.4モードとの機能差はありません。
- DataSourceオブジェクトのキャッシング
- 1.4モードとの機能差はありません。
(6) フォールトトレランスのための機能
ベーシックモードでデータベースに接続する場合に,フォールトトレランスのために使用できる機能を,次の表に示します。
表9-23 ベーシックモードでデータベースに接続する場合に使用できるフォールトトレランスのための機能
機能 | 使用可否 | 機能差※ |
---|
コネクションの障害検知 | × | - |
コネクション枯渇時のコネクション取得待ち | × | - |
コネクションの取得リトライ | ○ | なし |
コネクションプールの情報表示 | ○ | あり |
コネクションプールのクリア | ○ | なし |
コネクションの自動クローズ | ○ | あり |
コネクションの強制クローズ | ○ | あり |
コネクションスイーパ | ○ | なし |
トランザクションタイムアウト | ○ | あり |
トランザクションリカバリ | × | - |
障害調査用SQLの出力 | × | - |
コネクションプールのクラスタ化 | × | - |
(凡例)○:使用できる ×:使用できない -:該当しない
注※ 1.4モードとの機能差です。
以降,ベーシックモードで使用できるフォールトトレランスのための機能について説明します。
なお,それぞれの機能の概要および目的については,次の個所を参照してください。
- マニュアル「Cosminexus アプリケーションサーバ 機能解説 基本・開発編(コンテナ共通機能)」の「3.15 フォールトトレランスのための機能」
- マニュアル「Cosminexus アプリケーションサーバ 機能解説 基本・開発編(コンテナ共通機能)」の「3.15.1 コネクションの障害検知」
- マニュアル「Cosminexus アプリケーションサーバ 機能解説 基本・開発編(コンテナ共通機能)」の「3.15.2 コネクション枯渇時のコネクション取得待ち」
- マニュアル「Cosminexus アプリケーションサーバ 機能解説 基本・開発編(コンテナ共通機能)」の「3.15.3 コネクションの取得リトライ」
- マニュアル「Cosminexus アプリケーションサーバ 機能解説 基本・開発編(コンテナ共通機能)」の「3.15.4 コネクションプールの情報表示」
- マニュアル「Cosminexus アプリケーションサーバ 機能解説 基本・開発編(コンテナ共通機能)」の「3.15.5 コネクションプールのクリア」
- マニュアル「Cosminexus アプリケーションサーバ 機能解説 基本・開発編(コンテナ共通機能)」の「3.15.6 コネクションの自動クローズ」
- マニュアル「Cosminexus アプリケーションサーバ 機能解説 基本・開発編(コンテナ共通機能)」の「3.15.7 コネクションスイーパ」
- マニュアル「Cosminexus アプリケーションサーバ 機能解説 基本・開発編(コンテナ共通機能)」の「3.15.8 トランザクションタイムアウトとステートメントキャンセル」
- マニュアル「Cosminexus アプリケーションサーバ 機能解説 基本・開発編(コンテナ共通機能)」の「3.15.9 トランザクションリカバリ」
- マニュアル「Cosminexus アプリケーションサーバ 機能解説 基本・開発編(コンテナ共通機能)」の「3.15.10 障害調査用SQLの出力」
- マニュアル「Cosminexus アプリケーションサーバ 機能解説 基本・開発編(コンテナ共通機能)」の「3.17 コネクションプールのクラスタ化機能」
ここでは,ベーシックモードで特有の内容についてだけ説明します。
- コネクションの取得リトライ
- 1.4モードとの機能差はありません。マニュアル「Cosminexus アプリケーションサーバ 機能解説 基本・開発編(コンテナ共通機能)」の「3.15.5 コネクションプールのクリア」を参照してください。
- コネクションプールの情報表示
- コネクションプール内のコネクションの情報を,コマンドを使用して表示できます。コネクションプール情報の表示には,cjclosecnコマンドを使用します。コマンドの詳細については,マニュアル「Cosminexus アプリケーションサーバ リファレンス コマンド編」の「cjclosecn(J2EEサーバのコネクションクローズまたはコネクションの状態表示)」を参照してください。
- コネクションプールのクリア
- 1.4モードとの機能差はありません。マニュアル「Cosminexus アプリケーションサーバ 機能解説 基本・開発編(コンテナ共通機能)」の「3.15.3 コネクションの取得リトライ」を参照してください。
- コネクションの強制クローズ
- アプリケーションのConnection.closeメソッドの記述もれによってクローズされないコネクションは,コネクションプール内で使用中状態のまま再利用されません。これらのコネクションは,cjclosecnコマンドを使用して強制クローズできます。コマンドの詳細については,マニュアル「Cosminexus アプリケーションサーバ リファレンス コマンド編」の「cjclosecn(J2EEサーバのコネクションクローズまたはコネクションの状態表示)」を参照してください。
- なお,ユーザスレッドでは使用できません。
- コネクションの自動クローズ
- EJBコンテナによるコネクション自動クローズだけが有効になります。また,対象となるリソースは,データソースだけです。
- コネクションスイーパ
- 1.4モードとの機能差はありません。マニュアル「Cosminexus アプリケーションサーバ 機能解説 基本・開発編(コンテナ共通機能)」の「3.15.7 コネクションスイーパ」を参照してください。
- トランザクションタイムアウト
- ローカル呼び出し最適化機能を使用するかどうかによって,トランザクションタイムアウト後のJTAおよびJDBCインタフェースにアクセスできない期間が異なります。
ローカル呼び出し最適化機能を使用しない場合,該当するトランザクションを含むリモートインタフェースのメソッドが終了すればアクセスできます。ローカル呼び出し最適化機能を使用する場合は,リクエスト終了するまでアクセスできません。
- トランザクションタイムアウトが発生すると,トランザクションの状態がjavax.transaction.Status.STATUS_NO_TRANSACTIONになるため,Required属性,Supports属性,またはNever属性のビジネスメソッドが呼び出されます。トランザクションタイムアウト後にビジネスメソッドが呼び出されないようにするには,Mandatory属性を使用してください。ただし,ローカル呼び出し最適化機能を使用する場合は,トランザクションタイムアウト後に新しいトランザクションを開始できないので,タイムアウト後にRequired属性またはRequiresNew属性のビジネスメソッドは呼び出されません。
- ローカル呼び出し最適化機能を使用して,タイムアウトの発生後にStateful Session Bean(BMT)を呼び出した場合,またはリモートインタフェースのメソッド呼び出し中(トランザクションがサスペンド中)にタイムアウトが発生した場合,J2EEアプリケーションにタイムアウトの発生を通知しません。
J2EEアプリケーションでこの内容を考慮していない場合,意図しないDBMSのアクセスによる,データの不整合などの問題が発生するおそれがあります。この問題を回避するため,ローカル呼び出し最適化機能を使用しないか,または次の対策を行ってください。
JTA,またはJDBCインタフェースのアクセスで例外が発生した場合,およびリモートインタフェースのメソッド呼び出しでRemoteException例外が発生した場合は,リクエストを終了させます。また,Stateful Session Bean(BMT)を使用する場合は,そのメソッド内で,JTA,JDBCインタフェースに対して,必ずアクセスします。
(7) データソースを使用するときの注意
- java.sql.Connectionを,複数のトランザクション間で再利用することはできません。java.sql.Connectionをトランザクション内で利用する場合には,トランザクションごとに,javax.sql.DataSourceからgetConnection()メソッドを使用してコネクションを取得してください。
- java.sql.ConnectionのようなJDBCインタフェースのAPIでSQLException例外が発生すると,コネクションクローズで該当コネクションの接続が維持されていても,コネクションプールに戻さないで破棄します。その結果,余分なコネクション生成が発生して性能に影響を与えることがあります。