用于连接池(Hikari)重用的JDBC连接生命周期

用于连接池(Hikari)重用的JDBC连接生命周期,jdbc,hikaricp,Jdbc,Hikaricp,希卡里:2.4.7 PostgreSQL JDBC驱动程序:9.4-1201-jdbc41 我试图理解必须对java.sql.Connection对象执行哪些操作才能使其在 连接池 我刚刚将连接池引入了一个多线程应用程序,该应用程序 以前使用每个SQL语句建立/断开连接 在介绍Hikari之后,我注意到只要我每次尝试都点击maximumPoolSize 此后到HikariDataSource.getConnection将由于connectionTimeout而失败。看来我并没有以某种方式“释放”

希卡里:2.4.7

PostgreSQL JDBC驱动程序:9.4-1201-jdbc41

我试图理解必须对
java.sql.Connection
对象执行哪些操作才能使其在 连接池

我刚刚将连接池引入了一个多线程应用程序,该应用程序 以前使用每个SQL语句建立/断开连接

在介绍Hikari之后,我注意到只要我每次尝试都点击
maximumPoolSize
此后到
HikariDataSource.getConnection
将由于
connectionTimeout
而失败。看来我并没有以某种方式“释放”这种联系

连接
对象的典型用法是:

# omits Exception handling, parameter substitution, result evaluation. 
PreparedStatement preparedStatement = hikariDataSource.getConnection().prepareStatement(sql);
preparedStatement.executeQuery();
preparedStatement.close();
是否需要对此连接执行其他操作,以使其符合在连接池中重用的条件


自动提交
已打开
Connection.close()
,除非在Hikari提供的情况下做一些特殊的事情,这似乎正是我想要避免的

我不知道Hikari的具体情况,但是对于从连接池中取出的每个连接,您必须在完成连接后返回该连接

通常,这是通过使用
Connection.close()
-池发出一个包装函数,其中
close()
不会实际关闭连接,只返回它

因此,您的代码应该如下所示:

Connection con = hikariDataSource.getConnection();
PreparedStatement preparedStatement = con.prepareStatement(sql);
preparedStatement.executeQuery();
preparedStatement.close();
con.close(); // this returns the connection to the pool

当然,这两个
close()
方法应该在
finally
块中调用

谢谢你的快速回复。已签出,并且您的断言似乎是正确的-我可以看到在
连接中发生回收行为。关闭
PoolEntry.recycle()
。将给它一个尝试,并返回与投票和绿色勾号。或更好:使用资源尝试