Hitachi

Cosminexus V11 アプリケーションサーバ システム設計ガイド


8.5.1 コネクションプーリングを使用する

ここでは,J2EEサーバでコネクションプーリングを使用する利点と,コネクションプーリングに関連して使用できる機能について説明します。

また,JPAプロバイダでは,DB Connectorのコネクションを取得します。

〈この項の構成〉

(1) コネクションプーリングを使用する利点

データベースなどのEISとのコネクションの確立は,負荷が高くなる処理です。コネクションプーリングを使用することで,負荷を軽くできます。コネクションプーリングは,J2EEサーバによって一度取得,生成したコネクションをプールしておき,それを再利用することで処理性能の向上を図る機能です。データベースなどにアクセスするたびにコネクションを再取得する場合に比べて,性能劣化を防ぐ効果があります。

なお,EISとの接続方法によって,使用できる機能が異なります。詳細は,マニュアル「アプリケーションサーバ 機能解説 基本・開発編(コンテナ共通機能)」の「3.14.1 コネクションプーリング」を参照してください。

なお,デフォルトの設定では,コネクションプーリングは有効になっています。

(2) 使用できる機能

コネクションプーリングで使用できる機能と設定時の指針について示します。

コネクションプーリングでは,次の機能を使用できます。

注※1 この機能を使用する場合,コネクションの検査にタイムアウトを設定することもできます。

注※2 これらの機能は,デフォルトの設定では無効になっています。必要に応じて使用してください。

(a) プールするコネクションの最小値と最大値を指定する

コネクションプーリングを設定する場合は,プールするコネクションの最小値と最大値を設定します。無制限にした場合はコネクションが無制限に確立されます。

最小値および最大値は,定常状態で発生するデータベースなどのEISへの同時アクセス数,トランザクション数,業務の同時実行数などを参考にして決定してください。

プールするコネクションの最大値は,同時実行スレッド数,Session Beanインスタンスプールとの間で,次の関係式を満たすように設定することを推奨します。

プールするコネクションの最大値≧Session Beanインスタンスプール≧同時実行スレッド数

(b) プール内のコネクションを検査して無効なコネクションを破棄する

プール内のコネクションに障害が発生していないかどうかをコネクション取得時または定期的にチェックして,障害が発生したコネクションをプールから削除します(コネクション障害検知)。コネクション取得時に障害が発生しているコネクションを取得してしまうことを防ぎ,接続に失敗する可能性を低くできます。この機能は,DB Connectorを使用してデータベースにアクセスするためのコネクションに対して有効です。なお,SQL Serverを使用する場合,DB ConnectorのselectMethodプロパティにdirectを指定したときには,この機能は使用できません。

コネクション障害検知を実行するタイミングの使い分けの指針は次のとおりです。業務の種類に応じて使い分けてください。

表8‒22 コネクション障害検知を実行するタイミングの使い分けの指針

業務の種類

タイミング

  • EISとの接続の失敗が許容されない業務

  • コネクション取得頻度が低い業務

コネクション取得時に障害検知を実行する設定をお勧めします。

コネクション取得時に掛かる処理時間は,コネクション障害検知を実行しない場合に比べて多く掛かりますが,障害が発生しているコネクションを取得する可能性が低くなります。

  • コネクション取得頻度が高い業務

  • 障害が発生したコネクションを取得してもある程度許容されるような業務

定期的に障害検知を実行する設定をお勧めします。チェック間隔をある程度長くすることで,コネクション障害検知処理のために性能が劣化することを防げます。ただし,障害が発生しているコネクションを取得してしまうおそれがあります。

また,コネクション障害検知を実行する場合,コネクション障害検知の実行にタイムアウトを設定できます。サーバ障害やネットワーク障害が発生してリソースからの応答が返らない場合,コネクション障害検知の実行に対しても応答が返らなくなることがあります。タイムアウトを設定しておくことで,リソースからの応答が返らない場合も,コネクション障害検知処理を終了して,処理を継続できます。なお,この場合は,コネクションに障害が発生していると判断されます。

ポイント
  • コネクション障害検知にタイムアウトを設定した場合,システム内で,コネクションプールのコネクション数に応じたコネクション管理スレッドが生成されます。このため,コネクション障害検知にタイムアウトを設定すると,設定しない場合に比べて多くのメモリを消費するので,注意が必要です。

    コネクション管理スレッドは,コネクションプールのコネクション数の最大値の2倍の数が作成されます。必要なメモリ使用量を適切に見積もってください。

  • コネクション管理スレッドは,コネクション数調節機能のタイムアウトと共通で使用されます。このため,コネクション障害検知にタイムアウトを設定した場合,コネクション数調節機能のタイムアウトも有効になります。

  • コネクション障害検知のタイムアウトを有効にしてコネクション障害検知を実施する場合,コネクションプールから取り除いた未使用コネクションは,コネクションプール内のコネクション数としてカウントされません。そのため,コネクションプール内のコネクションとコネクションプールから取り除いた未使用コネクションの総数が,コネクションプールのコネクション数の最大値を一時的に超える場合があります。

(c) コネクション取得失敗時にリトライする

コネクションの取得に失敗したときに,ユーザプログラムでリトライする必要がなくなります。業務処理のレスポンスが下がっても,障害発生による業務停止を防ぎたい場合に設定してください。

リトライ回数とリトライ間隔を設定する場合の指針について次に示します。

  • リトライ回数を増やしたり,リトライ間隔を大きくしたりすると,コネクション取得処理が発生した場合に,待ち時間が発生するおそれがあります。

  • リトライ間隔×リトライ回数の時間が長過ぎると,RMI-IIOP通信のタイムアウトなどが発生しますが,タイムアウト後もリトライを続けます。このため,リトライ間隔×リトライ回数の時間は,タイムアウト値以下の値になるように設定してください。

  • 同一リソースのコネクションを使用する業務の所要時間にも左右されますが,10秒以上を指定することを推奨します。

(d) スイーパによって使わないコネクションをプールから自動削除する

一定時間使用しなかったコネクションをスイーパによってプールから自動削除します。コネクションを未使用のままプーリングすると問題が発生する場合に設定します。リソースアダプタ単位に設定できます。

(e) コネクションウォーミングアップによってあらかじめコネクションをプールしておく

J2EEサーバの起動時またはリソースアダプタのスタート時にコネクションを最小値まであらかじめ取得してプールしておく機能です。コネクションプールの使用を開始した直後の,アプリケーションからのコネクション要求のレスポンスを向上できます。ただし,J2EEサーバ起動またはリソースアダプタのスタート時の処理時間が掛かります。

(f) コネクション枯渇時のコネクション取得要求を待ち状態にする

プールしているコネクションをすべて使い切っている状態でコネクション取得要求があった場合に,コネクション取得要求を待ち状態にする機能です。

使用中のコネクションが解放されるか,コネクションが破棄されてコネクション最大数よりも少なくなった場合に,すぐにコネクション取得要求を再開できます。また,待ち時間も設定できるので,一定時間を経過してコネクションを取得できなかった場合はエラーにできます。

(g) コネクションプール内の不要なコネクションを段階的に減少させる

コネクションプール内に不要なコネクションがある場合に,コネクション数を段階的に減らす機能です(コネクション数調節機能)。

一定間隔でコネクションプールの数をチェックします。チェック直前までの間の最大同時実行コネクション数を基準として,プール内にそれ以上の数のコネクションがある場合は,多い分のコネクションを削除します。これによって,プール内のコネクションは実際の稼働実績に適した数になるので,コネクション生成コストの削減や,リソース資源の節約ができます。

また,コネクションの削除処理にタイムアウトを設定できます。タイムアウトには,コネクション管理スレッドを使用します。なお,コネクション管理スレッドは,コネクション障害検知のタイムアウトでも使用されます。

ポイント

コネクション管理スレッドは,コネクション障害検知のタイムアウトと共通で使用されます。このため,コネクション数調節機能にタイムアウトを設定した場合,コネクション障害検知のタイムアウトも有効になります。

また,コネクション数調節機能を使用すると,コネクションプールのコネクション数を調整するために取り除いた未使用コネクションは,コネクションプール内のコネクション数としてカウントされません。そのため,コネクションプール内のコネクションとコネクションプールから取り除いた未使用コネクションの総数が,コネクションプールのコネクション数の最大値を一時的に超える場合があります。