コネクションプールからコネクションを取得すると、接続が切れているコネクションを再利用してしまうことがある。
これを防ぐためにコネクションプール側で何かやっていないかなとちょっと調べた。
c3p0は
- testConnectionOnCheckin - プールから取得する時に接続チェックするかどうか
- testConnectionOnCheckout - プールに返す時に接続チェックするかどうか
- preferedTestQuery - 接続チェックする時にどのようなSQL文を実行するか。指定していないと、Connection.isValid→Connection.getMetadata().getTables(...)を呼ぶ
- connectionTesterClassName - 接続チェックするConnectionTesterインターフェースを実装したクラスを指定する
でいろいろ指定できる。
HikariCPは
- connectionTestQuery - 接続チェックする時にどのようなSQL文を実行するか。
で指定できる。connectionTestQueryが指定されていないとConnection.isValidを実行する。
逆にHibernateがデフォルトで実装しているプールなどは、こういうことはやってくれない。
JDBC4のConnection.isValidは便利そうなんだが、JDBCドライバ側があまり実装していないらしいので、テスト用のクエリを設定するのが主流っぽいな。