【问题标题】:JDBC connection lifecycle for Connection Pool (Hikari) reuse连接池(Hikari)重用的 JDBC 连接生命周期
【发布时间】:2017-01-07 08:24:03
【问题描述】:

光:2.4.7

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

我试图了解必须对 java.sql.Connection 对象执行什么操作才能使其在 连接池?

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

在介绍 Hikari 之后,我注意到的是,每次尝试点击maximumPoolSize 此后到HikariDataSource.getConnection 将由于connectionTimeout 而失败。所以看起来我并没有以某种方式“释放”这个连接。

Connection 对象的典型用法是:

# omits Exception handling, parameter substitution, result evaluation. 
PreparedStatement preparedStatement = hikariDataSource.getConnection().prepareStatement(sql);
preparedStatement.executeQuery();
preparedStatement.close();

是否需要对此连接执行任何其他操作以使其有资格在连接池中重复使用?

Autocommit 已开启。 Connection.close(),除非在 Hikari 提供的情况下做一些特别的事情,否则这似乎正是我想要避免的事情。

【问题讨论】:

    标签: jdbc hikaricp


    【解决方案1】:

    我不具体了解 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 块中调用。

    【讨论】:

    • 感谢您的快速响应。检查了source,看起来你的断言是正确的——我可以看到Connection.close和PoolEntry.recycle()中发生的回收行为。会给它一个裂缝,然后带着赞成票和绿色勾号回来。
    • 或者更好:使用 try-with-resources
    猜你喜欢
    • 2023-02-10
    • 2011-03-06
    • 1970-01-01
    • 2021-10-05
    • 2022-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多