0

Hibernate 文档说这代表org.hibernate.Session了一个单线程的工作单元。我知道工作单元是在数据库事务的上下文中使用的。当它说单线程时是什么意思?请帮助我理解这一点。

4

2 回答 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 回答