付録A.3 コネクションプーリングとコネクションスイーパの動作
データソースのプロパティで設定するコネクションプーリングとコネクションスイーパの動作,コネクションを共有する場合の留意点について説明します。
コネクションプーリングについては,マニュアル「Cosminexus アプリケーションサーバ 機能解説 基本・開発編(コンテナ共通機能)」の「3.14.1 コネクションプーリング」を参照してください。コネクションスイーパについては,マニュアル「Cosminexus アプリケーションサーバ 機能解説 基本・開発編(コンテナ共通機能)」の「3.15.7 コネクションスイーパ」を参照してください。
- <この項の構成>
- (1) コネクションプーリングの動作
- (2) コネクションスイーパの動作
- (3) コネクションを共有する場合の留意点
- (4) 注意事項
(1) コネクションプーリングの動作
- サーバ上での最初のアクセス時(具体的には最初のjavax.sql.DataSource#getConnectionメソッド発行時),コネクションプールにプールするコネクションの最小値(<MinimumSize>)の値のJDBCコネクションを確立(接続)しプールします。データベースサーバの制限によって<MinimumSize>の値のコネクションが確立できない場合,<MinimumSize>の値以下の状態になります。
- ユーザアプリケーションプログラムがJDBCコネクションを取得(javax.sql.DataSource#getConnectionメソッド)すると,プール内の未使用状態のコネクションが一つ選択され,ユーザアプリケーションプログラムに渡されます。選択された該当コネクションは,プール内で使用中状態となります。
- ユーザアプリケーションプログラムがJDBCコネクションを解放(java.sql.Connection#closeメソッド)すると,解放したJDBCコネクションに異常がなく,再利用できる場合,該当するJDBCコネクションはプール内で未使用状態に戻ります。解放したコネクションが再利用できない場合,該当するJDBCコネクションは破棄されます。
- 未使用状態のコネクションが,コネクションプールにプールするコネクションのしきい値(<Threshold>)の値以下になると,プール内のコネクションを,コネクションプールにプールするコネクションの増分値(<GrowthIncrement>)の値ずつ増加させます。DBサーバの制限によって<GrowthIncrement>の値のコネクションが確立できない場合は,増分は<GrowthIncrement>の値以下になります。
- ユーザアプリケーションプログラムがJDBCコネクションを取得しようとしたときにプールに未使用コネクションがない場合,コネクション取得待ち時間(<WaitTimeout>)の値の間,待たされます。このあと,まだプールに未使用コネクションがない場合,ユーザアプリケーションプログラムに例外が通知されます。
(2) コネクションスイーパの動作
- 前回のコネクションスイーパの動作が終了してから,スイーパ起動時間(<SweeperInterval>)の値の経過後,コネクションスイーパが動作します。
- コネクションスイーパは,プール内の未使用状態コネクションを次の観点で監視します。
- 該当コネクションの生成時点からの経過時間が,コネクション接続タイムアウト値(<ConnectionTimeout>)の値未満の場合は何もしません。
- 該当コネクションの生成時点からの経過時間が,<ConnectionTimeout>の値以上の場合はコネクションを破棄します。
- プールに残ったコネクション数が,<MinimumSize>の値以下の場合,コネクションスイーパは<MinimumSize>の値までコネクションを確立します。
(3) コネクションを共有する場合の留意点
コネクションシェア機能は,同一JavaVM内という条件で,同一トランザクション(ここでのトランザクションとはjavax.transaction.UserTransactionによるトランザクションまたはEJBでのCMTによるトランザクションだけ)中での同一データソース(javax.sql.DataSource)へのコネクション取得要求(getConnectionメソッド)に対して,アプリケーションが同一の物理コネクションを共有できるようにするものです。これによって,アプリケーションがトランザクション中で同じデータソースから複数回コネクションを取得してSQLを発行した場合,トランザクションコミット時にそれぞれのSQLの処理結果をデータベースにまとめて反映できます。この機能を利用するには,コネクションプールの設定でコネクション数<MinimumSize>を1以上に設定する必要があります。なお,コネクションシェア機能は,同一データソース(javax.sql.DataSource)に対し,パラメタなしgetConnectionメソッドと,パラメタありgetConnection(java.lang.String username,java.lang.String password)メソッド間では,同一トランザクション中でもコネクションを共有できません。また,パラメタありのgetConnection(java.lang.String username,java.lang.String password)メソッド間でusernameが異なる場合,同一トランザクション中でもコネクションを共有できません。
(4) 注意事項
- データソースの表示名(<display-name>)には,すでにあるデータソースの名前やメールサーバ構成情報の名前を指定しないでください。
- コネクションプーリングの設定を変更した場合,設定内容を有効にするためにJ2EEサーバを再起動してください。
- コネクションプーリング機能を利用する場合には,データベースサーバ側からコネクションを強制的に切断する機能(タイムアウトなど)を利用しないでください。