はじめに
某プロダクトが内部でBoneCPを使用しているのですが、ごくたまにプロダクトの再起動時にJDBCコネクションの取得に失敗してしまうことがあったため、BoneCP側で自動リトライができないか調べてみました。
なお、新規にBoneCPを使おうと考えている方は、現在はHikariCPを検討した方がよいです。BoneCPの作者自身もBoneCPは今は非推奨でHikariCPをすすめています。
確認したバージョン
BoneCP 0.7.1.RELEASE
関係するBoneCPのオプション
結論から言うと、下記のBoneCPのオプションが関係してきます。
項目 | 設定値の型 | 説明 |
---|---|---|
acquireRetryAttempts | int型 | リトライ回数を設定する。 |
acquireRetryDelayInMs | long型 | 接続失敗後の次のリトライ実行までの待機時間をミリ秒で設定する。 |
lazyInit | boolean型 |
true に設定すると、アプリケーションからgetConnection するまでプールは空で初期化する。デフォルトはfalse となっており、BoneCPの初期化処理で最初にgetConnection を行う。 |
最初の2つのオプションを設定するだけで一見よさそうに見えますが、ポイントは最後のlazyInit
オプションです。これをtrue
に設定しないと、BoneCPの初期化時にgetConnection
で接続エラーになってもリトライされません。acquireRetryAttempts
とacquireRetryDelayInMs
の設定は無視されます。ソースを見れば一目瞭然で、初期化時の最初のgetConnection
時はハードコードでこの2つの設定値を0
に設定しています。
幸いにも、lazyInit
をtrue
に設定することでBoneCP初期化時のgetConnection
をスキップすることができます。これにより、1発目のgetConnection
もリトライ対象にすることができるわけです。