てきとうなメモ

本の感想とか技術メモとか

Javaのコネクションプールの接続チェック

コネクションプールからコネクションを取得すると、接続が切れているコネクションを再利用してしまうことがある。
これを防ぐためにコネクションプール側で何かやっていないかなとちょっと調べた。

c3p0は

  • testConnectionOnCheckin - プールから取得する時に接続チェックするかどうか
  • testConnectionOnCheckout - プールに返す時に接続チェックするかどうか
  • preferedTestQuery - 接続チェックする時にどのようなSQL文を実行するか。指定していないと、Connection.isValid→Connection.getMetadata().getTables(...)を呼ぶ
  • connectionTesterClassName - 接続チェックするConnectionTesterインターフェースを実装したクラスを指定する

でいろいろ指定できる。

HikariCPは

  • connectionTestQuery - 接続チェックする時にどのようなSQL文を実行するか。

で指定できる。connectionTestQueryが指定されていないとConnection.isValidを実行する。

逆にHibernateがデフォルトで実装しているプールなどは、こういうことはやってくれない。

JDBC4のConnection.isValidは便利そうなんだが、JDBCドライバ側があまり実装していないらしいので、テスト用のクエリを設定するのが主流っぽいな。