Hibernate会话是单线程的意味着什么?

Hibernate会话是单线程的意味着什么?,hibernate,hibernate-session,Hibernate,Hibernate Session,上面说,org.hibernate.Session代表一个单线程工作单元。我知道工作单元是在DB事务的上下文中使用的。当它说单线程是什么意思?请帮助我理解这一点。这意味着您不能从多个线程中使用同一个会话实例,因为会话类的设计不足以实现这一点。因此,如果您在一个线程中打开一个会话,则只有该线程才能使用该会话以及从该会话中获得的实体。这意味着您不能从多个线程中使用同一会话实例,因为会话类的设计并没有使这成为可能。因此,如果您在一个线程中打开一个会话,则只有该线程应该使用该会话以及从该会话中获得的实体

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

这意味着您不能从多个线程中使用同一个会话实例,因为会话类的设计不足以实现这一点。因此,如果您在一个线程中打开一个会话,则只有该线程才能使用该会话以及从该会话中获得的实体。

这意味着您不能从多个线程中使用同一会话实例,因为会话类的设计并没有使这成为可能。因此,如果您在一个线程中打开一个会话,则只有该线程应该使用该会话以及从该会话中获得的实体。

来自会话JavaDoc:

实现程序不是线程安全的。相反,每个线程/事务应该从SessionFactory获取自己的实例

Hibernate会话是一个高度有状态的复杂对象(它缓存对象,将其内部表示与数据库同步,等等)。这只是一个警告,如果您在不同线程之间共享一个会话,那么两个线程可能同时调用方法,从而扰乱会话的内部状态并导致错误

Hibernate无法“检测”2个线程正在访问它,并且可能不会抛出异常。这不是为它设计的

关于线程安全的Wiki链接:

在单个线程上运行的程序很简单:所有程序都是按顺序运行的,因此行为是非常可预测的

OTOH,当您有2个或更多线程时,它们可以以意外的方式相互交互

例如:

公共类非线程安全{
公共int内部=0;
公共无效更新(){
用于(内部=0;内部<100;内部++){
系统输出打印项次(内部);
}
}
}

假设这个类的一个实例与两个线程共享。第一个调用
update
方法并开始迭代。发生这种情况时,第二个线程还调用
update
方法。这会对第一个文件重置
内部文件
,它们最终会相互冲突。

来自会话JavaDoc:

实现程序不是线程安全的。相反,每个线程/事务应该从SessionFactory获取自己的实例

Hibernate会话是一个高度有状态的复杂对象(它缓存对象,将其内部表示与数据库同步,等等)。这只是一个警告,如果您在不同线程之间共享一个会话,那么两个线程可能同时调用方法,从而扰乱会话的内部状态并导致错误

Hibernate无法“检测”2个线程正在访问它,并且可能不会抛出异常。这不是为它设计的

关于线程安全的Wiki链接:

在单个线程上运行的程序很简单:所有程序都是按顺序运行的,因此行为是非常可预测的

OTOH,当您有2个或更多线程时,它们可以以意外的方式相互交互

例如:

公共类非线程安全{
公共int内部=0;
公共无效更新(){
用于(内部=0;内部<100;内部++){
系统输出打印项次(内部);
}
}
}

假设这个类的一个实例与两个线程共享。第一个调用
update
方法并开始迭代。发生这种情况时,第二个线程还调用
update
方法。这会对第一个线程重置
internal
,它们最终会发生冲突。

非常感谢,如果我创建了两个Java线程并尝试访问会话实例,您能否告诉我,在这种情况下,Hibernate会引发异常?它可能会引发异常,但可能无法检测到。不要依赖它,只是不要这样做。非常感谢,如果我创建了2个Java线程并尝试访问会话实例,请告诉我,在这种情况下,Hibernate是否会抛出异常?它可能会抛出异常,但可能无法检测到。不要依赖它,只是不要做。非常感谢克里斯托弗非常感谢克里斯托弗
public class NotThreadSafe {
    public int internal = 0;

    public void update() {
        for (internal = 0; internal < 100; internal++) {
            System.out.println(internal);
        }
    }
}