3.15.1 コネクションの障害検知
コネクションプーリングを使用している場合,リソースダウン・ネットワーク障害などが発生すると,ユーザプログラムのコネクション取得要求に対し,障害が発生したコネクションを返すおそれがあります。コネクションの障害検知機能を使用すると,プーリングされているコネクションに障害が発生していないかをチェックし,障害が発生したコネクションをなるべく返さないようにできます。
コネクション障害検知機能は,コネクション取得リトライ機能と併用できます。この場合,ユーザプログラムのコネクション取得要求時にコネクション障害を検知すると,新しいコネクション取得のリトライを実施し,障害が復旧した時点でコネクションをユーザプログラムに返すことができます。
なお,新しいコネクションを作成して返すことは,コネクションの障害検知のタイミングを「コネクション取得要求時」に設定している場合だけ有効になります。
コネクションの障害検知のタイミングについては,「(2) 障害検知を実施するタイミング」を参照してください。
(1) 前提条件
コネクションの障害検知機能の利用可否を次の表に示します。
リソース |
接続方法 |
利用可否 |
---|---|---|
データベース |
DB Connector |
○ |
データベース上のキュー |
DB Connector for Reliable MessagingとReliable Messaging |
○ |
OpenTP1 |
TP1 Connector |
×※1 |
TP1/Message Queue - Access |
×※1 |
|
SMTPサーバ |
メールコンフィグレーション |
× |
JavaBeansリソース |
− |
× |
そのほかのリソース |
Connector 1.0仕様またはConnector 1.5仕様に準拠したリソースアダプタ |
△※2 |
(2) 障害検知を実施するタイミング
コネクションの障害を検知するタイミングは,表に示したタイミングのどちらかを選択できます。
障害検知のタイミング |
内容 |
---|---|
コネクション取得要求時 |
コネクション取得時に,毎回,障害検知を実施します。この場合,コネクション取得要求のレスポンス性能が劣化しますが,障害が発生したコネクションを取得する確率は低くなります。コネクション取得要求の頻度が少ない場合や,障害が発生したコネクションの取得がほとんど許容されない場合に有用です。 |
一定間隔 |
一定時間の間隔で,障害検知を実施します。障害検知の間隔をある程度長くすることで,障害検知処理による性能劣化を少なくできます。ただし,障害が発生したコネクションを取得する確率は高くなります。コネクション取得要求の頻度が多い場合や,障害が発生したコネクションの取得がある程度許容される場合に有用です。 |
なお,デフォルトでは,コネクション取得要求時に障害検知を実施する設定となっています。コネクションの障害検知を実施しない設定もできます。
コネクション障害検知の有効・無効の切り替えや,検知するタイミングの設定は,リソースアダプタのプロパティとして設定します。リソースアダプタの設定については,「3.15.13 実行環境での設定」を参照してください。
(3) 障害検知のタイムアウト
コネクション障害検知に対する応答時間にタイムアウトを設定できます。
サーバ障害やネットワーク障害が発生してリソースからの応答が返らない場合,コネクション障害検知の実行に対しても応答が返らなくなることがあります。タイムアウトを設定することで,リソースからの応答が返らない場合も,コネクションのチェックを終了して,処理を継続できます。なお,障害検知のタイムアウト時間は簡易構築定義ファイルのJ2EEサーバで指定するキーに,任意の時間を指定できます(デフォルト値は5秒)。
コネクション障害検知のタイムアウトは,コネクション管理スレッドを使用して動作します。コネクション管理スレッドは,コネクションプールのコネクション数の最大値に応じてリソースアダプタ開始時にシステム内で作成されます。コネクション管理スレッドの数と,コネクションプールのコネクション数の最大値の関係を次に示します。
コネクション管理スレッド数 = コネクションプールのコネクション数の最大値×2
このため,コネクション障害検知にタイムアウトを設定すると,設定しない場合に比べて多くのメモリを消費します。必要なメモリ使用量を適切に見積もってください。
また,コネクションプールのコネクション数の最大値の設定が無制限の場合,メッセージが出力されて,コネクション障害検知のタイムアウトが無効になります。
なお,コネクション障害検知のタイムアウトを有効にする場合の注意事項の詳細については,「(5) 注意事項」を参照してください。
コネクション障害検知のタイムアウトの有効・無効は,リソースアダプタのプロパティをカスタマイズして設定します。リソースアダプタのプロパティの設定については,「3.15.13 実行環境での設定」を参照してください。
(4) チェック時の動作
コネクション障害検知をコネクション取得要求時に実施する場合と,一定間隔で実施する場合の動作について説明します。
-
コネクション障害検知をコネクション取得要求時に実施する場合
コネクション障害検知をコネクション取得要求時に実施する場合の動作を次に示します。
-
コネクションプールから未使用コネクションが取得されます。
-
コネクションチェックメソッドによって,コネクションに障害が発生していないかどうかチェックされます。
コネクション障害検知のタイムアウトが無効な場合,このチェックはコネクション取得要求の延長で実施されます。
コネクション障害検知のタイムアウトが有効な場合,このチェックはコネクション管理スレッドで実施されます。サーバ障害やネットワーク障害などでチェックメソッドの応答がタイムアウト時間以内に返らないときは,コネクションに障害が発生していると判断されます。このとき,メッセージが出力されます。
なお,リソースアダプタにコネクションチェックメソッドが実装されていない場合,コネクションの状態はチェックされません。
-
コネクションに障害が発生している場合,チェックに使用したコネクションが破棄されて,新たに作成されたコネクションがユーザプログラムに返されます。
コネクションに障害が発生していない場合,チェックに使用したコネクションがユーザプログラムに返されます。
-
-
コネクション障害検知を一定間隔で実施する場合
コネクション障害検知を一定間隔で実施する場合の動作を次に示します。
-
コネクションプールから未使用コネクションが一つ取得されて,そのコネクションが有効であるかどうかがチェックされます。
ただし,未使用コネクションがプーリングされていない場合は,チェックされません。
-
コネクション障害検知のタイムアウトが無効な場合,コネクションチェックメソッドによって,コネクションに障害が発生していないかどうかのチェックが一定間隔で実施されます。
コネクション障害検知のタイムアウトが有効な場合,コネクション管理スレッドで,チェックが一定間隔で実施されます。サーバ障害やネットワーク障害などでチェックメソッドの応答がタイムアウト時間以内に返らないときは,コネクションに障害が発生していると判断されます。このとき,メッセージが出力されます。
なお,リソースアダプタにコネクションチェックメソッドが実装されていない場合,コネクションの状態はチェックされません。
-
コネクションに障害が発生している場合に,コネクション障害検知のタイムアウトが無効のときは,コネクションチェックに使用されたコネクションが破棄されて,コネクションプール内の使用中コネクションが再利用不可にマークされます。また,未使用コネクションが破棄されます。
コネクション障害検知のタイムアウトが有効のときは,コネクションチェックに使用したコネクションが破棄されて,コネクション管理スレッドによってコネクションプール内の使用中コネクションが再利用不可にマークされます。また,未使用コネクションが,コネクションプールから取り除かれて,破棄されます。
コネクションに障害が発生していない場合は,コネクションチェックに使用されたコネクションがコネクションプールに返却されます。
-
(5) 注意事項
障害検知機能についての注意事項を説明します。
(a) パラレルサーバ構成のリソースを使用する場合の注意事項
コネクション障害検知を一定間隔で実施する場合,コネクションプール内のコネクションをサンプリングチェックするため,一部のサーバに障害が発生しても検知できないことがあります。
(b) コネクション障害検知のタイムアウトを有効にした場合の注意事項
コネクション障害検知のタイムアウトを有効にした場合の注意事項を次に示します。
-
コネクション障害検知にタイムアウトを設定した場合,システム内で,コネクションプールのコネクション数に応じた障害検知用のスレッドが生成されます。このため,コネクション障害検知にタイムアウトを設定すると,設定しない場合に比べて多くのメモリを消費するので注意が必要です。
障害検知用のスレッドは,コネクションプールの最大コネクション数の2倍の数だけ作成されます。必要なメモリ使用量を適切に見積もってください。
-
サーバ障害やネットワーク障害などが繰り返し発生する場合にシステムの運用を続けると,コネクションチェックメソッドを実行中のコネクション管理スレッドが増え続け,システム側が用意したすべてのコネクション管理スレッドを使い切るおそれがあります。使用できるコネクション管理スレッドがない場合,メッセージが出力されて,コネクション取得要求がエラーとなります。
-
コネクション障害検知を実施する場合,コネクションプールから取り除いた未使用コネクションは,コネクションプール内のコネクション数としてカウントされません。そのため,コネクションプール内のコネクションとコネクションプールから取り除いた未使用コネクションの総数が,コネクションプールのコネクション数の最大値を一時的に超える場合があります。
(c) 障害検知機能を利用できないリソースを使用する場合の注意事項
障害検知機能を利用できないリソースに対しては,Connector属性ファイルで次のパラメタを指定して,コネクション管理スレッドを使用しない設定にしてください。
-
コネクションの障害検知のタイムアウト
<property>タグのValidationType=0