Hibernate documentation表示org.hibernate.Session
代表单线程工作单元。我知道在DB事务的上下文中使用了工作单元。它说单线程是什么意思?请帮助我理解这一点。
答案 0 :(得分:4)
这意味着您不能在多个线程中使用相同的Session实例,因为Session类的设计并不是为了实现这一点。因此,如果您在一个线程中打开一个会话,则只有该线程应该使用会话和从该会话中获取的实体。
答案 1 :(得分:1)
来自Session JavaDoc:
实现者不应该是线程安全的。相反,每个线程/事务应该从SessionFactory获取自己的实例。
Hibernate会话是一个高度有状态的复杂对象(它缓存对象,将其内部表示与数据库同步等)。这只是一个警告,如果你跨不同的线程共享一个会话,2个线程可能会同时调用方法,这会混淆会话的内部状态并导致错误。
Hibernate无法“检测”2个线程正在访问它并且可能不会抛出异常。它不是为它设计的。
关于线程安全的Wiki链接:http://en.wikipedia.org/wiki/Thread_safety。
在单个线程上运行的程序很简单:一切都按顺序运行,因此行为非常容易预测。
OTOH,当你有2个或更多线程时,他们可以以意想不到的方式互相交流。
E.g:
public class NotThreadSafe {
public int internal = 0;
public void update() {
for (internal = 0; internal < 100; internal++) {
System.out.println(internal);
}
}
}
想象一下这个类的1个实例与2个线程共享。第一个调用update
方法并开始迭代。在发生这种情况时,第二个线程也会调用update
方法。这样可以为第一个重置internal
,并且最终会相互冲突。