dataSourcePool 在释放到池时关闭断开的连接

dataSourcePool close broken connection when release to pool

我正在使用 Hikari jdbc 连接池。

当执行语句 时产生异常(例如网络中断)。如下:

try{
   Connection con = pool.getConnection();
   con.executeQuery("....");
}catch(Exception e){
   con.close();
}

con.close 是否会逐出断开的连接,而不是将其释放到池中。

如果断开的连接被释放到池中。它可能是通过 getConnection.

的请求得到的

在 finally 块中使用 con.close,否则在 catch 块中必须先询问 if con != null 以避免在 catch 块中产生异常。其他替代方案可以包含在其他 try{}catch{} 块中的 con.close() 。希望对您有所帮助。

如果您的驱动程序与 JDBC4 兼容(并支持 Connection.isValid()),则默认情况下通过此 API 完成连接验证。

否则您可以设置connectionTestQuery进行验证。

另见 discussion and the source 代码。

您应该考虑尝试使用资源:

try(Connection con = pool.getConnection()) {
  DO SOMETHING WITH CONNECTION
}catch(Exception e){
   e.printStackTrace();
}

这将保证连接返回到池中。检查连接是否有效是的任务,而不是您的代码的任务。您可以配置池以检查您与 connectionTestQuery 属性 的连接 - 就是这样。

如果您正在使用 try-with-resource 并且如果网络中断,HikariCP 很可能会关闭连接,而不是回收。 来自 HikariCP 源码,如果 connection.close() 中有这样的异常,它会在 checkException()

中关闭连接