我经常遇到这些术语。他们两个之间有区别吗?
在下面的 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/