【问题标题】:HikariCP multithreading separate connection for each threadHikariCP 多线程,每个线程单独连接
【发布时间】:2016-06-08 18:35:42
【问题描述】:

致 stackoverflow 社区的人们。我正在寻求有关 HikariCP 连接池问题的帮助。

高级: 我正在尝试使用线程池创建多个线程,我的计划是为每个工作线程提供与 HikariCP 的单独连接,但 HikariCP 所做的是它在多个线程之间共享一个公共连接。我正在使用

public synchronized Connection getConnection() throws SQLException
{
  synchronized (dataSource) {
  return dataSource.getConnection();
  }
}

检索数据库连接。现在,当我关闭一个连接时,我看到其他线程中的问题说连接已关闭并且线程正在处理的一批记录被丢弃。

以下是我的日志文件中的 stmts:

2016-06-08 11:52:11,000 DEBUG [com.boxer.delete.SmartProcessWorker] (pool-1-thread-6:) Closing DB connection ConnectionJavassistProxy(1551909727) wrapping oracle.jdbc.driver.T4CConnection@7b4f840f
2016-06-08 11:52:11,002 DEBUG [com.boxer.delete.SmartProcessWorker] (pool-1-thread-9:) Closing DB connection ConnectionJavassistProxy(1511839669) wrapping oracle.jdbc.driver.T4CConnection@343b8714
2016-06-08 11:52:11,014 ERROR [com.boxer.delete.SmartProcessWorker] (pool-1-thread-5:) SQLException trying to Execute pstmt batch
2016-06-08 11:52:11,014 ERROR [com.boxer.delete.SmartProcessWorker] (pool-1-thread-5:) Connection is closed
java.sql.SQLException: Connection is closed
        at com.zaxxer.hikari.proxy.ConnectionProxy.checkClosed(ConnectionProxy.java:275)
        at com.zaxxer.hikari.proxy.ConnectionJavassistProxy.commit(ConnectionJavassistProxy.java)
        at com.boxer.delete.SmartProcessWorker.processRecords(SmartProcessWorker.java:219)
        at com.boxer.delete.SmartProcessWorker.run(SmartProcessWorker.java:174)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:745)

现在,有人可以帮助我如何从 hikari 数据源获取 Db 连接,而该数据源显然没有被任何其他线程共享?

【问题讨论】:

  • 您找到解决问题的方法了吗?如果是,请您指出正确的方向,我和您的情况相同。提前谢谢你。

标签: multithreading concurrency database-connection connection-pooling hikaricp


【解决方案1】:

简短回答:不要那样做。 JDBC 连接并不意味着在线程之间共享。

来自 HikariCP (source) 的作者:

对 Connections 的多线程访问在 JDBC 中已被弃用,并且不是 HikariCP 也支持。

HikariCP 足够快,你可以获取一个连接,执行 SQL, 然后在一个过程中多次将其放回池中 请求。

最好只在局部变量中保存连接, 最好在 try-with-resources 块中,或者可能在 堆栈,但从不在类成员字段中。如果你遵循这种模式 泄漏连接或意外共享几乎是不可能的 跨线程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-24
    • 2012-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-14
    相关资源
    最近更新 更多