dbcpコネクション張りっぱなし

commons-dbcp、commons-pool を利用してWEBアプリのフレームワークを作るとき、気を付けることがあります。

ホットデプロイでDBのコネクションが張られっぱなしになる事象が発生し調査したところ、dbcp は一度にコネクションを張ったら基本張られっぱなしになることが分かりました。
もっとも、maxIdle や removeAbandon を設定して無駄なコネクションを少なくすることはできるのですが、ホットデプロイをした際に残っていたコネクションは切断されません。

もちろん、tomcat を再起動すれば、コネクションは切断されるのですが、運用上tomcatを再起動させたくない場合など、ホットデプロイでの対応が必要とされる場合があります。

これに対応するには、javax.servlet.ContextServletListener を実装したクラスを設けて、contextDestroyedメソッドに、アクティブなコネクションがpoolに戻るまで待機し、その後で、pool中のコネクションをすべて切断するようなコードを書く必要があります。そして、そのクラスをweb.xml にリスナーとして登録します。
こうすると、ホットデプロイ時に先述のメソッドが呼び出されて、コネクションを切断してくれます。