持久性单位为RESOURCE_LOCAL还是JTA?

com*_*tta 85 java spring persistence jpa jta

我有以下疑问:

  1. 这两个有什么区别?
  2. 所有数据库都支持这些吗?
  3. JPA TransactionManager和JTA TransactionManager有什么不同?

ska*_*man 95

JPA实现可以选择自己管理事务(RESOURCE_LOCAL),或者让它们由应用程序服务器的JTA实现管理.

在大多数情况下,RESOURCE_LOCAL很好.这将使用基本的JDBC级事务.缺点是该事务是JPA持久性单元的本地事务,因此如果您想要跨越多个持久性单元(或其他数据库)的事务,那么RESOURCE_LOCAL可能不够好.

JTA还用于管理JMS和JCA等系统的事务,但对于我们大多数人来说,这是非常奇特的用法.

要使用JTA,您需要在应用程序服务器中支持它,并且还需要JDBC驱动程序的支持.

  • 看来glassfih不允许我使用resource_local - 我怎么能这样做? (3认同)
  • _旁注:_即使没有使用第三方解决方案的完整Java EE应用服务器,也可以获得JTA功能,例如[Atomikos](https://www.atomikos.com/).因此,您可以拥有像Tomcat这样的轻量级Web容器,并且仍然可以获得JTA支持. (2认同)

inf*_*k01 78

作为其他答案的补充

以下是非常有用的文章(在Apache TomEE网站上发布)的摘录,它也可以帮助回答OP的第一个问题(该文章的链接如下).


比较RESOURCE_LOCAL和JTA持久性上下文


使用<persistence-unit transaction-type ="RESOURCE_LOCAL"> 负责EntityManager(PersistenceContext/Cache)创建和跟踪...

  • 必须使用 EntityManagerFactory来获取EntityManager
  • 生成的EntityManager实例 PersistenceContext/Cache
  • 一个 的EntityManagerFactory可以通过被注入 @PersistenceUnit注解只有(未@PersistenceContext)
  • 你是不是允许使用@PersistenceContext引用类型RESOURCE_LOCAL单位
  • 必须使用 EntityTransaction API开始/提交 对EntityManger的每次调用
  • 两次调用entityManagerFactory.createEntityManager()会导致 两个单独的EntityManager实例,从而产生 两个单独的PersistenceContexts/Caches.
  • 这是几乎从未有多于一个好主意, 比如在使用一个EntityManager的(不创建第二个,除非你已经破坏了第一)


<持久单元交易类型="JTA">所述 容器会做的EntityManager(PersistenceContext /高速缓存)创建和跟踪...

  • 不能使用 EntityManagerFactory来获取EntityManager
  • 您只能获取容器提供 的EntityManager
  • 一个的EntityManager 可以通过注入@PersistenceContext 注解只有(未@PersistenceUnit)
  • 不能使用@PersistenceUnit来引用JTA类型的单位
  • 容器给出的EntityManager与JTA事务关联的PersistenceContext/Cache 的引用.
  • 如果没有正在进行的JTA事务,则无法使用 EntityManager, 因为没有PersistenceContext/Cache.
  • 大家都用一个EntityManager参照同一单元同一事务将自动具有到一个参考 相同PersistenceContext /高速缓存
  • 在JTA 提交刷新并清除PersistenceContext/Cache

有兴趣学习Java Persistence API的人 - 请帮个忙,阅读完整的文章:JPA Concepts:JPA 101.

  • 只想添加一点:如果您使用的是Spring,可以将@ PersistenceContext和EntityManager与Resource_Local一起使用.在这种情况下,Spring容器可以使用@Transactional注释来管理事务. (7认同)

Cha*_*tni 17

Resource_Local和JTA是事务管理器(执行事务的方法).这不是数据库的属性,而是负责协调事务的组件.JPA和JTA事务管理器是不同的.JPA事务管理器负责JPA事务,如果您只进行JPA事务,则需要使用它.JTA事务管理器是通用事务管理器,可以在事务中登记其他资源,例如JMS队列.通常,Java EE容器为EJB,JPA实体等使用JTA事务管理器.