JPA,JTA中的逻辑工作单元和单个工作单元

时间:2014-11-17 09:59:07

标签: java hibernate jpa transactions jta

我经常遇到这些条款。他们和他们中的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中)会不断发展,每个会在自己的单线程中跨越自己的工作?

1 个答案:

答案 0 :(得分:1)

SessionFactory是线程安全的,你有一个给定DataSource的单例Sessionfactory。

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

在任何给定时间,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。