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()
中关闭连接
我正在使用 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进行验证。
另见
您应该考虑尝试使用资源:
try(Connection con = pool.getConnection()) {
DO SOMETHING WITH CONNECTION
}catch(Exception e){
e.printStackTrace();
}
这将保证连接返回到池中。检查连接是否有效是池的任务,而不是您的代码的任务。您可以配置池以检查您与 connectionTestQuery 属性 的连接 - 就是这样。
如果您正在使用 try-with-resource 并且如果网络中断,HikariCP 很可能会关闭连接,而不是回收。 来自 HikariCP 源码,如果 connection.close() 中有这样的异常,它会在 checkException()
中关闭连接