如何在Hibernate中将事务绑定到多个线程?

如何在Hibernate中将事务绑定到多个线程?,hibernate,spring,Hibernate,Spring,最初,代码采用以下结构,工作非常好- 初始代码: @Transactional class foo { void public work() { task1; task2; } } @Transactional class foo { void public work() { final Thread t1 = new Thread(new Job1()); t1.start(); final Thre

最初,代码采用以下结构,工作非常好-

初始代码:

@Transactional
class foo
{
  void public work()
  {
      task1;
      task2;     
  }
}
@Transactional
class foo
{
  void public work()
  {
      final Thread t1 = new Thread(new Job1());
      t1.start();

      final Thread t2 = new Thread(new Job2());
      t2.start();

      t1.join();
      t2.join(); 
  }

  class Job1
  {
     public void run()
     {
        task1;
     }   
  }

 class Job2
  {
     public void run()
     {
        task1;
     }   
  }
由于这两个任务可以并行执行,我们进行了重构,将它们放在两个线程下。 在不同的线程中编写这两个任务,并行调用它们,并在调用相应的DAO时得到以下错误

没有绑定到线程的Hibernate会话,并且配置不允许在此创建非事务会话

由于hibernate会话绑定到当前线程,因此子线程会出现问题

重构代码:

@Transactional
class foo
{
  void public work()
  {
      task1;
      task2;     
  }
}
@Transactional
class foo
{
  void public work()
  {
      final Thread t1 = new Thread(new Job1());
      t1.start();

      final Thread t2 = new Thread(new Job2());
      t2.start();

      t1.join();
      t2.join(); 
  }

  class Job1
  {
     public void run()
     {
        task1;
     }   
  }

 class Job2
  {
     public void run()
     {
        task1;
     }   
  }

}即使可以在多个线程之间共享Spring管理的事务,这也不是一个好主意,因为Hibernate事务绑定到
会话
s,并且Hibernate
会话
不是线程安全的,所以不能从多个线程使用相同的
会话

也许最好将代码设计为所有数据库访问都由单个线程执行,而其他线程只执行数据处理