Hibernate 文档说这代表org.hibernate.Session
了一个单线程的工作单元。我知道工作单元是在数据库事务的上下文中使用的。当它说单线程时是什么意思?请帮助我理解这一点。
问问题
1066 次
2 回答
4
这意味着您不能从多个线程中使用同一个 Session 实例,因为 Session 类的设计并未使之成为可能。所以,如果你在一个线程中打开一个会话,只有这个线程应该使用这个会话和从这个会话中获得的实体。
于 2014-08-02T21:16:32.610 回答
1
来自会话 JavaDoc:
实现者并不是线程安全的。相反,每个线程/事务都应该从 SessionFactory 获得自己的实例。
Hibernate 会话是一个高度有状态的复杂对象(它缓存对象,将其内部表示与数据库同步等)。这只是一个警告,如果您在不同的线程之间共享会话,则 2 个线程可能会同时调用方法,从而弄乱会话的内部状态并导致错误。
Hibernate 无法“检测”到 2 个线程正在访问它并且可能不会抛出异常。它只是不是为它而设计的。
关于线程安全的 Wiki 链接:http ://en.wikipedia.org/wiki/Thread_safety 。
在单线程上运行的程序很简单:一切都按顺序运行,因此行为非常可预测。
OTOH,当您有 2 个或更多线程时,它们可以以意想不到的方式相互交互。
例如:
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
第一个的效果,它们最终会相互冲突。
于 2014-08-03T06:04:34.667 回答