跨线程共享jdbc“连接”

时间:2013-09-19 14:12:18

标签: java multithreading jdbc transactions

我有一个定期运行的主线程。它使用setAutoCommit(false)打开一个连接,并作为对少数子线程的引用传递,以执行各种数据库读/写操作。在子线程中执行相当多的操作。在所有子线程完成其数据库操作之后,主线程将使用打开的连接提交事务。请注意,我在ExecutorService中运行线程。我的问题是,建议跨线程共享连接吗?如果“是”,请查看以下代码是否正确实现它。如果“否”,在多线程场景中执行事务的其他方法是什么?欢迎提出意见/建议/新意见。伪代码......

Connection con = getPrimaryDatabaseConnection();
// let me decide whether to commit or rollback
con.setAutoCommit(false);

ExecutorService executorService = getExecutor();
// connection is sent as param to the class constructor/set-method
// the jobs uses the provided connection to do the db operation
Callable jobs[] = getJobs(con); 
List futures = new ArrayList();
// note: generics are not mentioned just to keep this simple
for(Callable job:jobs) {
    futures.add(executorService.submit(job));
}
executorService.shutdown();
// wait till the jobs complete
while (!executorService.isTerminated()) {
  ;
}

List result = ...;
for (Future future : futures) {
    try {
       results.add(future.get());
    } catch (InterruptedException e) {
      try {
        // a jobs has failed, we will rollback the transaction and throw exception
        connection.rollback();
        result  = null;
        throw SomeException();
      } catch(Exception e) {
       // exception
      } finally {
         try {
           connection.close();
         } catch(Exception e) {//nothing to do}
      }    
   }
}
// all the jobs completed successfully!
try {
  // some other checks
  connection.commit();
  return results;
} finally {
  try {
      connection.close();
  } catch(Exception e){//nothing to do}
}

3 个答案:

答案 0 :(得分:3)

我不建议您在线程之间共享连接,因为连接操作非常慢并且应用程序的整体性能可能会受到损害。

我建议您使用Apache Connections Pool并为每个帖子提供单独的连接。

答案 1 :(得分:1)

您可以创建一个包含JDBC连接并提供同步访问的代理类 它。线程永远不应该直接访问连接。

根据您提供的用途和操作,您可以使用synchronized方法,或者如果代理需要锁定直到他离开某个状态,则锁定对象。


对于那些不熟悉代理设计模式的人。这里是wiki article。基本思想是代理实例隐藏了另一个对象,但提供了相同的功能。

答案 2 :(得分:1)

在这种情况下,请考虑为每个工作人员创建单独的连接。如果任何一个工作程序失败,则回滚所有连接。如果全部通过,则提交所有连接。

如果您将拥有数百名工作人员,那么您需要提供对Connection对象的同步访问,或者使用@mike和@NKukhar建议的连接池。