java - JPA、JTA 中的逻辑工作单元和单一工作单元

标签 java hibernate jpa transactions jta

我经常遇到这些术语。他们两个之间有区别吗?

在下面的 Java 代码中,该方法是线程安全的:

class Counter {
    private int i = 0;

    public synchronized void inc() {
        i++;
    }
}

在 Hibernate 中的 SessionFactory 和 Session 上下文中,

SessionFactory (org.hibernate.SessionFactory) - A thread-safe

Session (org.hibernate.Session) - A single-threaded, short-lived object representing a   
conversation between the application and the persistent store. 

我在理解它们的定义时感到困惑。

我所吸收的是,由于SessionFactory线程安全,任何线程首先需要获取锁,然后才能对其进行操作,即当多个线程同时访问时,保证实现不存在竞争条件。 (注意,我是同时写的,而不是并行)。当一个线程完成其工作后,队列中的另一个线程将获取锁,依此类推。没有 2 个线程会同时处理它。

session 不是线程安全的,它代表单线程工作单元

在sessionfactory之后,多个 session (在sessionfactory中)是否会在各自的单线程中发展各自的工作?

最佳答案

SessionFactory 是线程安全的,并且对于给定的数据源,您有一个单例 SessionFactory。

session 可以either be created for the life time of a single request or even extended to span over multiple user requests .

在任何给定时间, session 始终必须绑定(bind)到单个线程。即使您使用扩展的持久性上下文,在某个时间点也只有一个请求/线程访问 session 。

所以Session不应该被并发访问。这就是为什么您不需要同步实体,至少从 Hibernate 的角度来看不需要。每个 session 加载它自己的实体副本,并且通常通过 optimistic locking 来确保并发性。因为拥有 application-level repeatable reads 是可取的.

因此实体不应同步。并发控制发生在数据库内部,而不是在应用程序逻辑中。每个客户端请求始终会在物理数据库事务范围内发出 DML 语句,并且database transactions always acquire locks when rows get changes (even for READ_COMMITTED) .

总而言之, session 及其所有附加实体并不是安全的。 Session 工厂是线程安全的,因为每个 DataSource 只能获得一个单例实例,并且可以使用它来创建新的 Session。

关于java - JPA、JTA 中的逻辑工作单元和单一工作单元,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26969991/

相关文章:

java - @ManyToOne 和 @OneToOne 与 @EmbeddedId 的关系

java - JPA 一对一关系未被识别

java - 如何在 asp.net 响应中包含一个 java 页面?

javascript - 使用 iText 在 pdf 的某些位置上进行 Java Stamp

java - 对于实体,是否可以在 HQL 中使用与类名不同的名称

java - Hibernate 错误地在子类而不是父类(super class)中寻找属性的设置者?

java - JPA:一个父类(super class)的不同列名称

java - 可选字段的 Avro 序列化

java - Android:当许多包使用 R.java 时出错

java - 在 Hibernate Envers 中是否可以查询给定修订的所有实体?