持久性单元作为RESOURCE_LOCAL或JTA?

问题描述 投票:84回答:4

我有疑问如下:

  1. 是什么这两个的区别?
  2. 由所有数据库这两种支持?
  3. 是JPA事务管理和JTA事务管理器有什么不同?
java spring jpa persistence jta
4个回答
95
投票

JPA实现有管理交易本身(RESOURCE_LOCAL),或让他们通过应用程序服务器的JTA实现管理的选择。

在大多数情况下,RESOURCE_LOCAL是罚款。这将使用基本的JDBC级交易。不足之处是该交易是本地JPA持久性单元,所以如果你想跨越多个持久化单元(或其他数据库)交易,那么可能RESOURCE_LOCAL是不够好。

JTA也用于遇到像JMS和JCA系统管理事务,但是这对于我们大多数人相当奇特的用法。

要使用JTA,你需要支持它在你的应用服务器,还从JDBC驱动程序支持。


77
投票

作为除其他答案

下面是从非常有用的文章(在Apache TomEE网站上公布),这也可以帮助回答OP的第一个问题(链接到文章正下方)的摘录。


Comparing RESOURCE_LOCAL and JTA persistence contexts


与<持久单元交易类型=“RESOURCE_LOCAL”>您正在负责的EntityManager(PersistenceContext /高速缓存)创建和跟踪...

  • 您必须使用EntityManagerFactory的获得一个EntityManager
  • 将所得EntityManager实例是PersistenceContext /高速缓存
  • EntityManagerFactory的可通过@PersistenceUnit注解仅注射(未@PersistenceContext)
  • 您不允许使用@PersistenceContext引用类型RESOURCE_LOCAL单位
  • 您必须使用EntityTransaction API开始/每次调用提交同意你的EntityManager
  • 调用entityManagerFactory.createEntityManager()两次结果在两个分开的EntityManager实例,并且因此两个单独的持久化上下文/缓存。
  • 这是几乎从来没有在使用中有一个EntityManager的多个实例是一个好主意(不创建第二个,除非你已经破坏了第一)

与<持久单元交易类型=“JTA”>容器将做的EntityManager(PersistenceContext /高速缓存)创建和跟踪...

  • 不能使用EntityManagerFactory的获得一个EntityManager
  • 你只能得到由容器提供一个EntityManager
  • 一个EntityManager可以通过@PersistenceContext注解仅注射(未@PersistenceUnit)
  • 您不允许使用@PersistenceUnit引用类型JTA单位
  • 由容器给出的EntityManager的是为与JTA事务相关联的PersistenceContext /高速缓存的参考。
  • 如果没有JTA事务正在进行中,EntityManager的不能用,因为没有PersistenceContext /缓存。
  • 大家都用一个EntityManager参照同一单元在同一事务将自动具有到相同PersistenceContext /高速缓存的参考
  • 该PersistenceContext / Cache被冲洗,并在JTA清除提交时间

任何有兴趣学习Java持久性API - 请在这里请你帮个忙,并阅读全文:JPA Concepts: JPA 101


17
投票

RESOURCE_LOCAL和JTA的事务管理器(在做交易的方法)。这不是数据库的属性,但该组件负责协调事务。 JPA和JTA事务管理器是不同的。 JPA事务管理器负责JPA交易,你想用一个,如果你只是做JPA事务。 JTA事务管理器是通用的事务管理器和可以借助其他资源,如在交易JMS队列。典型的Java EE容器使用为EJB,JPA实体等一个JTA事务管理器


0
投票

RESOURCE_LOCAL VS JTA其对本地交易VS全局事务。这是关于我们可以下单成交管理多个资源。

CMT VS BMT其有关谁在打开和关闭交易 - 应用开发者或应用程序服务器。

© www.soinside.com 2019 - 2024. All rights reserved.