持久性单位为RESOURCE_LOCAL还是JTA?

时间:2009-12-26 03:11:36

标签: java spring jpa persistence jta

我的查询如下:

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

4 个答案:

答案 0 :(得分:93)

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

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

JTA还用于管理JMS和JCA等系统之间的交易,但对于我们大多数人来说,这是非常奇特的用法。

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

答案 1 :(得分:75)

作为其他答案的补充

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


  

比较RESOURCE_LOCAL和JTA持久性   上下文

     

<小时/>

     

使用&lt; persistence-unit   交易类型= “RESOURCE_LOCAL” &GT;   负责EntityManager   (PersistenceContext / Cache)创建和跟踪......

     
  • 必须使用   获取EntityManager的 EntityManagerFactory
  •   
  • 生成的 EntityManager 实例    一个PersistenceContext / Cache
  • An    EntityManagerFactory 可以通过注入   仅 @PersistenceUnit 注释(不是   @PersistenceContext)
  • 允许   使用@PersistenceContext来引用RESOURCE_LOCAL
  • 类型的单位   
  • 必须使用    EntityTransaction 用于开始/提交的API   每次致电您的EntityManger
  • 致电   entityManagerFactory.createEntityManager()两次导致   两个单独的EntityManager实例及其后   两个单独的PersistenceContexts / Caches。
  • 它   几乎从不一个好主意,不止一个   正在使用的EntityManager的实例(不要创建   第二个,除非你已经销毁了第一个)
     


     

使用&lt; persistence-unit   transaction-type =“JTA”&gt;    CONTAINER 将执行EntityManager   (PersistenceContext / Cache)创建和跟踪......

     
  • 不能使用   获取EntityManager的 EntityManagerFactory
  •   
  • 您只能获得由。提供的 EntityManager   容器
  • EntityManager   可以通过 @PersistenceContext 注入   仅限注释(不是@PersistenceUnit)
  • 你是   允许使用@PersistenceUnit来引用a   JTA类型的单位
  • EntityManager 给出   容器是引用的   与JTA事务关联的PersistenceContext / Cache。
  •   
  • 如果没有正在进行的JTA事务,则为EntityManager   无法使用因为没有   PersistenceContext / Cache。
  • 每个人都有一个EntityManager   引用中的相同单位   交易会自动引用   相同的PersistenceContext / Cache
  •   PersistenceContext / Cache 刷新并清除   JTA 提交时间

任何有兴趣学习Java Persistence API的人 - 请帮自己一个忙,并阅读完整文章:JPA Concepts: JPA 101

答案 2 :(得分:17)

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

答案 3 :(得分:0)

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

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