Hibernate Session是单线程的意思是什么?

时间:2014-08-02 21:07:54

标签: hibernate hibernate-session

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

2 个答案:

答案 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,并且最终会相互冲突。