nekop's blog

OpenShift / JBoss / WildFly / Infinispanの中の人 http://twitter.com/nekop

JBoss ASのデータソース障害検知

JBoss Advent Calendar 2011の6日目のエントリです。昨日に引き続きJDBCデータソースのコネクションプールや障害検知まわりを書こうと思います。

まずはおさらい。障害検知を有効化するには<valid-connection-checker-class-name>または<check-valid-connection-sql>のどちらかを定義します。<exception-sorter-class-name>はオマケですが定義したほうが良いでしょう。

さて、細かい障害検知系の設定解説に入ります。

  • <validate-on-match>
    • コネクション取得時(DataSource.getConnection()時)にコネクションチェックを行います。デフォルトでtrueです。AS7/EAP6からはfalseです。
  • <background-validation-millis>
    • 0より大きい値を指定することで、バックグラウンドでコネクションチェックを行います。デフォルトは0で無効です。コネクションプール内の未使用コネクションは指定されたミリ秒間隔で定期的にコネクションチェックされるようになります。
  • <background-validation>と<background-validation-minutes>
    • 非推奨です。忘れてください。<background-validation-millis>を利用してください。
  • <use-fast-fail>
    • <validate-on-match>有効時のオプションで、プールから取得したコネクションが使えなかった場合、プールから次のコネクションを取得するのではなく、即時に新たなコネクションを作成します。例えばデータベースを再起動したときなど、プール内のコネクションが全て使えなくなっている、というときに再接続を早く行うためのオプションです。もちろん、プール内の他のコネクションはノータッチなので、使えないコネクションはプールに残ったままになります。<use-fast-fail>を無効化すると逆の動作となり、全てのコネクションが使えないと判断されて破棄されてから、新しいコネクションを一つ作成することになります。この場合、プール内のコネクションは1つとなり、<min-pool-size>まで作成されることはありません。他のバックグラウンドでコネクションが破棄されるシナリオでは<min-pool-size>まで回復します。
  • <idle-timeout-minutes>
    • 利用されていないコネクションを定期的に破棄します。デフォルト30であり、30分利用されていないものが破棄されます。このチェックは(指定された値 / 2)の間隔で実行されるので、15分ごとにチェックされることになります。

オマケ。コネクションプールが<min-pool-size>で指定された数まで一気に戻るタイミングは以下です。以下に出てくる<prefill>のデフォルトはfalseです。

  • <prefill>がtrue指定されている場合データソースデプロイ時
  • <prefill>がfalseの場合、データソースから初めてコネクションを取得した時
  • <background-validation-millis>指定でコネクションが破棄された後
  • <idle-timeout-minutes>指定でコネクションが破棄された後
  • コネクションプールのJMXオペレーションflushを呼び出してコネクションプールをリフレッシュしたとき

つまり、<validate-on-match>での破棄以外は<min-pool-size>で指定された数まで一気に戻ります。<validate-on-match>でこのような時間のかかりそうなことをやってしまうとランタイムパフォーマンスに直にひびきそうなので、そのタイミングではやらない、ってことですね。