DBCPでconnection reset by pearが起きた時に自動復帰させる

(;´д`) ハマったわぁ

状況

DBCP使ってConnectionPoolingしてる状態でDBサーバー側から接続が切られた場合、DBCPにプールされてるConnectionはconnectedのままなので、次回使用時に「connection reset by pear」で例外が出る。

この現象が起こりやすいのは

  • DBサーバー/データベースの再起動
  • ネットワークが切れた
  • ファイアウォールのidle thresholdでぶち切られた

といったとこか。
最後のが良くあるパターン。

Tomcatを再起動とかすればプールがクリアされるので再度実行可能にはなるんだけど、そりゃ運用とは言えないよね。

DataSource.getConnection()でエラーになったらreleaseすればいいんじゃね?_

DataSource (Java 2 Platform SE 5.0)
AbandonedObjectPool (Jakarta Commons Database Connection Pool)

(;´д`) releaseの口が無い

DBCPリソースに設定は無いもんか。

DBCP - Configuration

(;´д`) 普通にありやがんのな

validationQuery
Connectionが有効かチェックするSQLを指定する。1行以上のデータを返すselect文である必要がある。チェックで使われるのでパフォーマンス優先でクエリ設計すべき。
testOnBorrow
Connection取得時に上記validationQueryを使って有効性チェックを行うか。validationに失敗するとそのコネクションはプールから破棄される。*1
testWhileIdle
アイドル中にvalidationQueryを使って有効性チェックを行うか。validationに失敗するとそのコネクションはプールから破棄される。timeBetweenEvictionRunsMillisの間隔で実行される。
timeBetweenEvictionRunsMillis
testWhileIdleの実行間隔[ms]
minEvictableIdleTimeMillis
この時間idleしたらコネクションを自動的に破棄する。

つーことで

validationQuery= select top 1 * from hoge 
testOnBorrow = true
testWhileIdle = true
timeBetweenEvictionRunsMillis = 30sec
minEvictableIdleTimeMillis = 10min

としてみた。

(;´д`) こんな基本的なとこでサボってたツケががが

*1:失敗した場合nullが返るか他のコネクションが返るかは不明。ソース当たらなきゃ