3.14.1 コネクションプーリング
サーブレット,JSP,EJBなどのJ2EEコンポーネントからのリソースアクセス量に応じて,リソースコネクション(JDBCコネクション,およびリソースアダプタのコネクション)をプーリングする機能です。コネクションをプーリングすることによって,ユーザアプリケーションからのリソース接続要求を高速に処理します。
- 〈この項の構成〉
(1) 前提条件
コネクションプーリング機能は,リソースの種類,接続方法の組み合わせによって,使用できる場合とできない場合があります。コネクションプーリング機能の使用について次の表に示します。
リソースの種類 |
接続方法 |
利用可否 |
---|---|---|
データベース |
DB Connector |
○ |
データベース上のキュー |
DB Connector for Reliable MessagingとReliable Messaging |
○ |
OpenTP1 |
TP1 Connector |
○ |
TP1/Message Queue - Access |
○ |
|
SMTPサーバ |
メールコンフィグレーション |
× |
JavaBeansリソース |
− |
× |
そのほかのリソース |
Connector 1.0仕様またはConnector 1.5仕様に準拠したリソースアダプタ |
○ |
(2) コネクションプールの生成および初期化
コネクションプールが生成・初期化されるタイミングは,リソースのスタート処理時です。コネクションプールのウォーミングアップ機能を有効にした場合,この時点でコネクションを生成します。コネクションプールのウォーミングアップ機能を無効にした場合,リソースのスタート時にコネクションは生成されず,最初のコネクション取得要求の発生時にコネクションを生成します。
コネクションプールの生成単位は次のとおりです。
-
Connector 1.0仕様に対応したリソースアダプタを使用する場合,リソース単位に一つのコネクションプールが生成されます。
-
Connector 1.5仕様に対応したリソースアダプタを使用する場合,コネクション定義ごとに一つのコネクションプールが生成されます。
(3) コネクションプールの終了処理
リソースのアンデプロイ時やJ2EEサーバの終了時は,コネクションプール内のすべてのコネクションを削除し,コネクションプール自体も削除します。なお,コネクションプールの終了処理では,コネクションに関するトランザクションなどがすべて決着済みのものとして処理します。
(4) 例外が発生したコネクションの破棄
データベース障害などが発生すると,コネクションプールに格納しているコネクションは使えなくなるため,コネクションプールから速やかに破棄する必要があります。
アプリケーションサーバは,コネクション,またはStatementのようなコネクションからの生成物に対する処理で例外が発生すると,コネクションクローズ時に該当コネクションをコネクションプールから破棄します。ただし,ローカルトランザクションの決着処理が正常終了した場合には,コネクションが正常であると判断するため破棄しません。
コネクションが正常に維持している状態で,コネクションやコネクションからの生成物で例外が発生すると,グローバルトランザクションを使用している場合には,トランザクションの決着処理が正常終了してもアプリケーションサーバはコネクションをコネクションプールに戻さないで破棄します。そのため余分なコネクション生成が発生して性能に影響を与えることがあります。
なお,トランザクションタイムアウト発生時には,トランザクション種別に関係なくコネクションをコネクションプールから破棄します。
(5) コネクションプール利用上の注意事項
コネクションプールを利用する場合の注意事項について説明します。
-
データベースサーバ側から強制的に切断する機能(タイムアウトなど)を利用しないでください。
-
コネクションプールで管理するコネクションは,取得時に使用した認証情報(ユーザ名,パスワードなど)を保持するため,サインオンの形態によっては注意が必要です。
- コンテナ管理でのサインオンの場合
-
一つのコネクションプールに対して,コネクション取得要求時に使用する認証情報は常に一つとなるため,特に注意は必要ありません。
- コンポーネント管理でのサインオンの場合
-
複数のユーザ名とパスワードの組み合わせを利用する場合に注意が必要です。コネクションプールはリソースごとに一つであるため,一つのリソースに対して複数のユーザが利用する場合,複数のユーザで一つのコネクションプールを共有することになります。この場合,一人のユーザが,コネクションプールの最大値に設定した数までコネクションを利用できないことがあります。
また,コネクションプール内の未使用コネクションの中に,認証情報が一致するコネクションがない場合,プール内のコネクション総数によって,次のように動作します。
コネクション総数が,指定したコネクションプールの最大値に達している場合,未使用状態のコネクションを破棄して,新規にコネクションを生成します。
コネクション総数が,指定したコネクションプールの最大値に達していない場合,新規にコネクションを生成します。
(6) コネクションプーリングの動作
リソースアダプタのコネクションプーリングの動作を次の表に示します。
ユーザアプリケーションプログラム処理 |
コネクションプールの状態 |
コネクションプールの動作 |
---|---|---|
コネクションの取得要求 |
プール内に未使用状態のコネクションがある |
未使用状態の時間がいちばん長いコネクションが選択され,ユーザアプリケーションプログラムに渡されます。選択されたコネクションは,プール内で使用中状態になります。 |
プール内に未使用状態のコネクションがなく,プール内のコネクションの総数が「MaxPoolSize」の値未満 |
新規にコネクションを確立します。確立したコネクションはユーザアプリケーションに渡され,コネクションはプール内で使用中状態となります。 |
|
プール内に未使用状態のコネクションがなく,プール内のコネクションの総数が「MaxPoolSize」の値に達している |
ユーザアプリケーションプログラムに例外が通知され,コネクションの取得は失敗します。再取得するためには,「Retry Count」と「Retry Interval」を設定します。 |
|
プール内に未使用状態のコネクションがあるが,認証情報が一致するコネクションがない |
プール内のコネクションの総数によって次の処理が実施されます。
|
|
コネクションを解放 |
解放したコネクションに異常がなく,再利用できる |
このコネクションはプール内で未使用状態に戻ります。 |
解放したコネクションが再利用できない |
このコネクションは破棄されます。 |
|
− |
コネクションプールのウォーミングアップ機能を使用 |
リソースアダプタの開始時またはリソースアダプタを開始済みの状態でのサーバ起動時に,「MinPoolSize」の値までコネクションが生成されてプールされます。 コネクションプールのウォーミングアップ機能を使用するためには,「Warmup」を設定します。 |
コネクション枯渇時のコネクション取得待ち |
コネクションプールにコネクションが最大数プールされていて利用できるコネクションがプールにない状態(コネクション枯渇)のときに,コネクションの取得要求を待ち状態にできます。 待ち状態になっているコネクション取得要求は,コネクションが解放されるとすぐにコネクションを取得できます。 コネクション枯渇時のコネクション取得待ちは,「RequestQueueEnable」「RequestQueueTimeout」で設定します。 |
なお,コネクションプールのウォーミングアップ機能を使用する場合は,次の表に示す注意事項があります。
条件 |
注意事項 |
---|---|
コンテナ認証用の認証情報(ユーザ名,パスワードなど)の設定※ |
コンポーネント管理でのサインオンで,複数のユーザ名とパスワードの組み合わせで利用する場合に注意が必要です。コネクションプールはリソースごとに一つであるため,一つのリソースに対して複数のユーザが利用する場合,複数のユーザで一つのコネクションプールを共有することになります。この場合,一人のユーザが,コネクションプールの最大値に設定した数までコネクションを利用できないことがあります。 コンテナ管理でのサインオンの場合は,一つのコネクションプールに対して,コネクション取得要求時に使用する認証情報は常に一つとなるため,特に注意は必要ありません。 |
「MinPoolSize」の設定 |
次のような場合,MinPoolSizeに指定した値よりもプールされているコネクションが少なくなることがあります。
リソースの開始時にMinPoolSize分のコネクションが生成されるため,コネクションプールのウォーミングアップ機能を使用しない場合に比べてサーバの起動またはリソースアダプタの開始に時間が掛かります。 また,このときに「bufSizeに指定した値 × 生成したコネクション数分のメモリ」をJavaヒープ領域に確保します。 MinPoolSizeに必要以上に大きな値を設定してウォーミングアップ機能を使用すると,メモリを確保したときにJavaヒープを使い切り,OutOfMemoryErrorが発生するおそれがあります。 このため,MinPoolSizeの値は,使用するリソースマネジャの最大同時接続数以下に設定してください。 |