JDBC 连接池 (Hikari) 重用的连接生命周期
JDBC connection lifecycle for Connection Pool (Hikari) reuse
光:2.4.7
PostgreSQL JDBC 驱动程序:9.4-1201-jdbc41
我正在尝试了解必须对 java.sql.Connection
对象执行哪些操作才能使其在
连接池?
我刚刚将连接池引入到一个多线程应用程序中
之前与每个 SQL 声明建立/拆除连接。
在介绍 Hikari 之后,我注意到的是,一旦我点击 maximumPoolSize
每次尝试
此后 HikariDataSource.getConnection
将因 connectionTimeout
而失败。所以我似乎不是"releasing"这个连接。
Connection
对象的典型用法是:
# omits Exception handling, parameter substitution, result evaluation.
PreparedStatement preparedStatement = hikariDataSource.getConnection().prepareStatement(sql);
preparedStatement.executeQuery();
preparedStatement.close();
为了使它符合在连接池中重用的条件,是否需要在此连接上执行任何其他操作?
Autocommit
开启。 Connection.close()
,除非在 Hikari 提供的情况下做一些特别的事情,否则这似乎正是我想要避免的事情。
我不是特别了解 Hikari,但是对于从连接池中取出的每个连接,您必须在完成后 return 该连接它。
通常这是使用 Connection.close()
完成的 - 池分发一个包装函数,其中 close()
不会物理关闭连接,仅 return 关闭它。
因此您的代码应如下所示:
Connection con = hikariDataSource.getConnection();
PreparedStatement preparedStatement = con.prepareStatement(sql);
preparedStatement.executeQuery();
preparedStatement.close();
con.close(); // this returns the connection to the pool
当然应该在finally
块中调用这两个close()
方法。
光:2.4.7
PostgreSQL JDBC 驱动程序:9.4-1201-jdbc41
我正在尝试了解必须对 java.sql.Connection
对象执行哪些操作才能使其在
连接池?
我刚刚将连接池引入到一个多线程应用程序中 之前与每个 SQL 声明建立/拆除连接。
在介绍 Hikari 之后,我注意到的是,一旦我点击 maximumPoolSize
每次尝试
此后 HikariDataSource.getConnection
将因 connectionTimeout
而失败。所以我似乎不是"releasing"这个连接。
Connection
对象的典型用法是:
# omits Exception handling, parameter substitution, result evaluation.
PreparedStatement preparedStatement = hikariDataSource.getConnection().prepareStatement(sql);
preparedStatement.executeQuery();
preparedStatement.close();
为了使它符合在连接池中重用的条件,是否需要在此连接上执行任何其他操作?
Autocommit
开启。 Connection.close()
,除非在 Hikari 提供的情况下做一些特别的事情,否则这似乎正是我想要避免的事情。
我不是特别了解 Hikari,但是对于从连接池中取出的每个连接,您必须在完成后 return 该连接它。
通常这是使用 Connection.close()
完成的 - 池分发一个包装函数,其中 close()
不会物理关闭连接,仅 return 关闭它。
因此您的代码应如下所示:
Connection con = hikariDataSource.getConnection();
PreparedStatement preparedStatement = con.prepareStatement(sql);
preparedStatement.executeQuery();
preparedStatement.close();
con.close(); // this returns the connection to the pool
当然应该在finally
块中调用这两个close()
方法。