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リソースに設定は無いもんか。
(;´д`) 普通にありやがんのな
- 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が返るか他のコネクションが返るかは不明。ソース当たらなきゃ