持久单元是RESOURCE_LOCAL还是JTA?


87

我有以下查询:

  1. 这两者有什么区别?
  2. 所有数据库都支持这两种方法吗?
  3. JPA TransactionManager和JTA TransactionManager是否不同?

Answers:


101

JPA实现可以选择自己管理事务(RESOURCE_LOCAL),还是由应用程序服务器的JTA实现管理事务。

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

JTA还用于跨JMS和JCA之类的系统管理事务,但这对我们大多数人来说是相当奇特的用法。

要使用JTA,您需要在应用程序服务器中对其进行支持,并且还需要JDBC驱动程序的支持。


3
似乎glassfih不允许我使用resource_local-我该怎么做?
Pete_ch

3
附带说明: 即使没有完整的Java EE应用服务器,也可以通过使用第三方解决方案(例如Atomikos)来获得JTA功能。因此,您可以拥有像Tomcat这样的轻量级Web容器,并且仍然获得JTA支持。
informatik01

84

作为其他答案的补充

这是一篇非常有用的文章(在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的(不创建除非你破坏了第一第二个)


使用<persistence-unit transaction-type =“ JTA”>容器将执行EntityManager(PersistenceContext / Cache)创建和跟踪...

  • 不能使用 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概念:JPA 101


8
只是想补充一点:如果您使用的是Spring,则可以将@ PersistenceContext和EntityManager与Resource_Local一起使用。在这种情况下,Spring容器可以使用@ Transactional注释来管理事务。
2015年

在我的项目transaction-type=RESOURCE_LOCAL,并@PersistenceContext@Transactional由Spring管理
拉维帕雷克

由于您提供的链接,我碰到的三角形朝上。
Koray Tugay

@KorayTugay对不起,您不太了解您说的是什么三角形?
informatik01

1
@LinuRadu这个答案也许对你有所帮助:有什么用Hibernate中调用Session.flush()的
informatik01

18

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


1

resource_local与JTA有关本地事务与全局事务。我们可以在一次交易中管理多个资源。

CMT与BMT的关系是谁在打开和关闭交易-应用程序开发人员或应用程序服务器。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.