猿问

持久单元是RESOURCE_LOCAL还是JTA?

我有以下查询:

  1. 这两者有什么区别?

  2. 所有数据库都支持这两种方法吗?

  3. JPA TransactionManager和JTA TransactionManager是否不同?


繁华开满天机
浏览 655回答 3
3回答

收到一只叮咚

JPA实现可以选择自己管理事务(RESOURCE_LOCAL),还是由应用程序服务器的JTA实现对其进行管理。在大多数情况下,RESOURCE_LOCAL是可以的。这将使用基本的JDBC级事务。缺点是该事务对于JPA持久性单元而言是本地的,因此,如果您想要一个跨越多个持久性单元(或其他数据库)的事务,那么RESOURCE_LOCAL可能不够好。JTA还用于跨JMS和JCA之类的系统管理事务,但这对我们大多数人来说是相当奇怪的用法。要使用JTA,您需要在应用程序服务器中对其进行支持,并且还需要JDBC驱动程序的支持。

肥皂起泡泡

作为其他答案的补充这是一篇非常有用的文章(在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事务,则由于没有PersistenceContext / Cache ,因此无法使用 EntityManager 。大家都用一个EntityManager参照同一单元在同一事务将自动具有到一个参考 相同PersistenceContext /高速缓存在JTA 提交时刷新并清除PersistenceContext / Cache有兴趣学习Java Persistence API的任何人-请帮个忙,并在此处阅读完整的文章:JPA概念:JPA 101。

手掌心

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

相关分类

Java
我要回答