我经常遇到这些条款。他们和他们中的2个人有区别吗?
在下面的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 是 线程安全 ,所以任何线程首先需要获取锁定然后将继续工作,即 当多个线程同时访问时,保证实现没有竞争条件 。 (注意我写了 同时 而不是 parellely )。一个线程完成其工作后,队列中的另一个线程将获取锁定,依此类推。没有2个线程可以同时处理它。
会话 非线程安全 ,它代表 单线程工作单元
在sessionfactory之后,多个会话(在一个sessionfactory中)会不断发展,每个会在自己的单线程中跨越自己的工作?
答案 0 :(得分:1)
SessionFactory是线程安全的,你有一个给定DataSource的单例Sessionfactory。
在任何给定时间,Session始终必须绑定到单个Thread。即使您使用扩展的持久性上下文,它也只能在一个时间点访问会话的一个请求/线程。
因此不应同时访问会话。这就是为什么你不需要同步你的实体,至少不是从Hibernate的角度来看。每个会话加载它自己的实体副本,并且通常使用optimistic locking确保并发性,因为它需要application-level repeatable reads。
因此不应同步实体。并发控制发生在数据库内部,而不是在应用程序逻辑中。每个客户端请求将始终在物理数据库事务的范围内发出DML语句,并database transactions always acquire locks when rows get changes (even for READ_COMMITTED)。
总而言之,会话及其所有附加实体都不是安全的。 Session工厂是线程安全的,因为每个DataSource只能获得一个单例实例,并且您可以使用它来创建新的Sessions。