2011-04-07 80 views
2

最初的代码是在下面的结构和它的工作完美的罚款 -如何将事务绑定到Hibernate中的多个线程?

初始代码:

@Transactional 
class foo 
{ 
    void public work() 
    { 
     task1; 
     task2;  
    } 
} 

由于这两个任务可以并行执行,我们重构将它们放在两个线程。 写在不同的线程的两个任务,调用它们并联得到以下错误而相应的DAO调用

没有Hibernate的Session绑定到线程,配置不允许非事务之一创建这里

由于hibernate会话绑定到当前线程,它成为子线程的问题。

重构的代码:

@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; 
    } 
    } 

}

回答

5

即使它可以将多个线程之间共享Spring管理的事务,这不是一个好主意,因为Hibernate事务绑定到Session S,而Hibernate Session不是线程安全的,因此您不能使用来自多个线程的相同Session

也许最好是以这样一种方式设计代码,即所有数据库访问都由单个线程执行,而其他线程只执行数据处理。

相关问题