HikariCP多线程分离每个线程的连接

时间:2016-06-08 18:35:42

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

对于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连接,这显然不会被任何其他线程共享吗?

1 个答案:

答案 0 :(得分:0)

简短的回答:不要那样做。 JDBC连接不是要在线程之间共享。

来自HikariCP(source)的作者:

  

在JDBC中已弃用对Connections的多线程访问,但不是   还是由HikariCP支持。

     

HikariCP足够快,您可以获得连接,执行SQL,   然后将其返回池中多次   请求。

     

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

相关问题