【问题标题】:Difference between a "jta-datasource" and a " resource-local " datasource?“jta-datasource”和“resource-local”数据源之间的区别?
【发布时间】:2023-04-02 10:30:02
【问题描述】:

术语“jta-datasource”和“resource-local datasource”对我来说有点模糊。我正在记下我的理解(或假设),我想让你说出我对/错的地方。

  • 同一数据库可以称为 jta 数据源或资源本地数据源
  • 如果提到 jta-datasource,那么 bean/其他类可以使用 JTA。因此,UserTransaction 接口
  • 如果数据源是资源本地,则不能使用CMT / BMT
  • 如果作为资源本地数据源提及,则事务不支持 JTA。代码可以使用EntityTransaction接口,但不能使用UserTransaction接口

谢谢!

【问题讨论】:

    标签: java jpa jakarta-ee ejb-3.0 jta


    【解决方案1】:

    术语“jta-datasource”和“resouce-local datasource”对我来说有点模糊。

    我猜你实际上指的是jta-datasourcenon-jta-datasource 元素。简而言之:

    • 如果持久化单元的事务类型是JTA,则jta-datasource元素用于声明将用于获取连接的JTA数据源的JNDI名称。这是常见的情况。
    • 如果持久化单元的事务类型是resource-local,则应使用non-jta-data-source来声明非JTA数据源的JNDI名称。
    • 同一数据库可以称为 jta 数据源或资源本地数据源

    这是正确的。而且我没有在上面提到这一点,但一些提供商甚至允许同时声明 jta-datasource non-jta-datasource 并使用后者通过非 JTA 连接优化读取(即不会' t 关联到正在进行的 JTA 事务)。

    • 如果提到 jta-datasource,那么 bean/其他类可以使用 JTA。因此,UserTransaction 接口。

    第一部分是正确的,最后一部分是不完全的。来自 EJB 3.0 规范,13.3.4 Enterprise Beans Using Container-Managed Transaction Demarcation 部分

    企业 bean 的业务方法 [...] 不得尝试获取或使用 javax.transaction.UserTransaction 接口。

    以及16.12 UserTransaction 接口部分:

    容器不得将UserTransaction 接口提供给不允许使用该接口的企业bean。

    换句话说,UserTransaction 接口对 CMT 企业 bean 不可用。

    • 如果数据源是本地资源,则不能使用 CMT / BMT

    这里的措辞有点混乱,但我想说这并不完全正确。从 JPA 1.0 规范的 § 5.5 控制事务部分:

    应用程序管理的实体管理器可以是 JTA 实体管理器或资源本地实体管理器。

    ...

    Java EE Web 容器和 EJB 容器需要同时支持 JTA 实体管理器和资源本地实体管理器。在 EJB 环境中,通常使用 JTA 实体管理器。

    以及第 6.2.1.2 节交易类型

    transaction-type属性用于指定实体管理器工厂为持久化单元提供的实体管理器必须是JTA实体管理器还是资源本地实体管理器。该元素的值为JTARESOURCE_LOCAL。 JTA 的事务类型假定将提供 JTA 数据源 — 由 jta-data-source 元素指定或由容器提供。通常,在 Java EE 环境中,RESOURCE_LOCALtransaction-type 假定将提供非 JTA 数据源。在 Java EE 环境中,如果未指定此元素,则默认为 JTA。

    所以你可以使用一个应用程序管理的实体管理器,它可以是一个资源本地实体管理器(你必须注入一个EntityManagerFactory来从中获取EM这种情况),它不会成为 JTA 交易的一部分。见this (very interesting) discussion

    • 如果作为资源本地数据源提及,则事务不支持 JTA。代码可以使用EntityTransaction接口,但不能使用UserTransaction接口

    同样,措辞有点混乱,但我想说这是正确的。

    【讨论】:

    • 嗨,非常感谢您抽出宝贵的时间并如此清楚地解释!我现在看到我们使用术语“资源本地实体管理器”而不是“资源本地数据源”。是的,当我说“资源本地数据源”时,我的意思是非 jta-datasource。这就是我现在的理解:JTA / RESOURCE_LOCAL --> EntityManager 的事务类型。确定谁控制基础交易。 JTA / EntityTransaction API JTA EntityManger: Container 是否管理这个EntityManager。涉及 JTA 事务。 JTA 事务可以是 CMT 或 BMT。可以在托管类中使用。
    • Resource-Local EntityManager:EnityManager 不受容器管理。涉及非 JTA 交易。使用 EntityTransaction API。可以在 POJO 中使用 对于 BMT,UserTransaction 始终使用 jta-datasource 而不能使用非 jta-datasource 同样对于 CMT,容器只能使用 jta-datasource
    • @stratwine:不客气,很高兴你发现它有帮助(而且你的理解看起来是正确的)。关于措辞,我并不是要挑剔,但由于规范定义了一个非常精确(和微妙)的术语,使用它使交流更容易,这就是为什么我坚持一点(我建议阅读我部分引用的部分)。
    • @PascalThivent 链接到“这个(非常有趣的)讨论”不起作用,你的意思是以下吗? java.net/projects/glassfish/lists/users/archive/2009-07/message/…
    猜你喜欢
    • 2012-02-24
    • 1970-01-01
    • 2011-04-11
    • 1970-01-01
    • 2012-08-08
    • 1970-01-01
    • 2010-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多