最初的代码是在以下结构中,它工作得很好 -
初始代码:
@Transactional
class foo
{
void public work()
{
task1;
task2;
}
}
Run Code Online (Sandbox Code Playgroud)
由于这两个任务可以并行执行,我们重构将它们置于两个线程之下.在不同的线程中编写了两个任务,并行调用它们并在调用相应的DAO时收到以下错误
没有Hibernate会话绑定到线程,配置不允许在这里创建非事务性的
由于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;
}
}
Run Code Online (Sandbox Code Playgroud)
}
即使可以在多个线程之间共享Spring管理的事务,这也不是一个好主意,因为Hibernate事务绑定到Sessions,而Hibernate Session不是线程安全的,所以你不能在Session几个线程中使用相同的.
也许以这样的方式设计代码会更好,即所有数据库访问都由单个线程执行,而其他线程只执行数据处理.
| 归档时间: |
|
| 查看次数: |
2518 次 |
| 最近记录: |