持久性单元作为RESOURCE_LOCAL或JTA?
我有如下查询:
- 这两者有什么不同?
- 这两个都支持所有的数据库?
- JPA TransactionManager和JTA TransactionManager是不同的?
JPA实现可以select自己pipe理事务( RESOURCE_LOCAL
),或者由应用程序服务器的JTA实现来pipe理事务。
在大多数情况下,RESOURCE_LOCAL没问题。 这将使用基本的JDBC级事务。 缺点是事务对JPA持久性单元是本地的,所以如果你想要一个跨越多个持久性单元(或其他数据库)的事务,那么RESOURCE_LOCAL可能不够好。
JTA还用于pipe理像JMS和JCA这样的系统上的事务,但对于我们大多数人来说,这是相当奇特的用法。
要使用JTA,需要在应用程序服务器中支持它,并且还需要JDBC驱动程序的支持。
作为其他答案的补充
下面是一篇非常有用的文章(发布在Apache TomEE网站上)的摘录 ,这也可以帮助解答OP的第一个问题(文章链接如下)。
比较RESOURCE_LOCAL和JTA持久性上下文
使用<persistence-unit transaction-type =“RESOURCE_LOCAL”> 您负责EntityManager(PersistenceContext / Cache)的创build和跟踪…
- 您必须使用EntityManagerFactory来获取一个EntityManager
- 得到的EntityManager实例是一个PersistenceContext / Cache
- EntityManagerFactory只能通过@PersistenceUnit注解注入(而不是@PersistenceContext)
- 您不允许使用@PersistenceContext来引用RESOURCE_LOCALtypes的单位
- 您必须使用EntityTransaction API来开始/提交对EntityManger的每个调用
- 调用entityManagerFactory.createEntityManager()两次会产生两个单独的EntityManager实例,因此有两个独立的PersistenceContexts / Caches。
- 使用EntityManager的多个实例 几乎不是一个好主意(除非已经销毁了第一个实例 ,否则不要创build第二个实例 )
使用<persistence-unit transaction-type =“JTA”> CONTAINER将执行EntityManager(PersistenceContext / Cache)创build和跟踪…
- 您不能使用EntityManagerFactory来获取EntityManager
- 你只能得到一个由容器提供的EntityManager
- 一个EntityManager只能通过@PersistenceContext注解注入(而不是@PersistenceUnit)
- 您不允许使用@PersistenceUnit来引用JTAtypes的单元
- 容器给出的EntityManager是对与JTA事务关联的PersistenceContext / Cache的引用 。
- 如果没有正在进行的JTA事务, 则不能使用 EntityManager,因为没有PersistenceContext / Cache。
- 每个在同一个事务中使用EntityManager引用同一个单元的人都会自动引用同一个PersistenceContext / Cache
- PersistenceContext / Cache在JTA 提交时被刷新并清除
任何有兴趣学习Java持久性API的人 – 请自己来帮忙,并阅读完整的文章: JPA概念:JPA 101 。
Resource_Local和JTA是事务pipe理器(进行事务的方法)。 这不是数据库的属性,而是负责协调事务的组件。 JPA和JTA交易pipe理者是不同的。 JPA事务pipe理器负责JPA事务,如果您只是在执行JPA事务,您希望使用JPA事务。 JTA事务pipe理器是通用事务pipe理器,可以在事务中引入其他资源,例如JMS队列。 通常,Java EE容器为EJB,JPA实体等使用JTA事务pipe理器。