如何在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会话
不是线程安全的,所以不能从多个线程使用相同的会话
也许最好将代码设计为所有数据库访问都由单个线程执行,而其他线程只执行数据处理