【问题标题】:Persistence unit as RESOURCE_LOCAL or JTA?持久性单元为 RESOURCE_LOCAL 还是 JTA?
【发布时间】:2010-12-30 01:41:25
【问题描述】:

我有以下疑问:

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

【问题讨论】:

    标签: java spring jpa persistence jta


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 似乎 glassfih 不允许我使用 resource_local - 我该怎么做?
    • 附带说明: 即使没有完整的 Java EE 应用程序服务器,使用第三方解决方案(例如 Atomikos)仍然可以获得 JTA 功能。因此,您可以拥有像 Tomcat 这样的轻量级 Web 容器,并且仍然获得 JTA 支持。
    【解决方案2】:

    作为对其他答案的补充

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


    比较 RESOURCE_LOCAL 和 JTA 持久性 上下文


    使用 负责 EntityManager (PersistenceContext/Cache) 创建和跟踪...

    • 必须使用 EntityManagerFactory 获取 EntityManager
    • 生成的 EntityManager 实例 一个 PersistenceContext/Cache
    • 一个 EntityManagerFactory 可以通过 @PersistenceUnit 仅注解(不是 @PersistenceContext)
    • 不允许 使用 @PersistenceContext 来引用 RESOURCE_LOCAL 类型的单元
    • 必须使用 EntityTransaction API 开始/提交 每次调用您的 EntityManger
    • 调用 entityManagerFactory.createEntityManager() 两次导致 两个单独的 EntityManager 实例,因此 两个单独的 PersistenceContexts/Caches。
    • 几乎从来没有拥有多个 instance 正在使用的 EntityManager(不要创建 第二个,除非你已经摧毁了第一个)


    使用 CONTAINER 会做 EntityManager (PersistenceContext/Cache) 创建和跟踪...

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

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

    【讨论】:

    • 只是想补充一点:如果您使用的是 Spring,您可以将 @PersistenceContext 和 EntityManager 与 Resource_Local 一起使用。这种情况下Spring容器可以使用@Transactional注解来管理事务。
    • 在我的项目中 transaction-type=RESOURCE_LOCAL@PersistenceContext@Transactional 由 Spring 管理
    • 由于您提供的链接,我击中了朝上的三角形。
    • @KorayTugay 对不起,不太明白你说的是什么三角形?
    • @LinuRadu 这个答案可能对你有帮助:What's the use of session.flush() in Hibernate
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      resource_local vs JTA 它关于本地事务与全局事务。它是关于我们能否在一个事务下管理多个资源。

      CMT 与 BMT 的区别在于谁在打开和关闭事务 - 应用程序开发人员或应用程序服务器。

      【讨论】:

        猜你喜欢
        • 2014-12-10
        • 1970-01-01
        • 2017-02-17
        • 2011-12-22
        • 2021-08-16
        • 2014-01-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多