カーソルリーク

ダメコードの海になっている某システムで「あるコードがある場合に ResultSetをclose()しないことで結果的にopened cursorが溜まって行ってエラーになる」という事象があり障害個所を発見できないかということでちょいと考えてみた。

このコード群は自前のコネクションプールを持っていて Pool#getConnection()することになっている。つまり、

  conn = Pool.getConnection();
  .
  .
  Pool.releaseConnection(conn);

という使い方をしている。ここでstatementや resultsetについては自前での解放が必須だが、誰かがリークしているといつかは破綻してしまう。典型的なダメパターンなのだが、過去の遺産はこんな感じなので、なんとかしてやらんと。
とりあえず Wrappingされたconnectionをかえして、prepareとかしたときにカウントなんかしておいてリリースチェックをするようにしてみたが ResultSetは監視できない。うーむ。