“jta数据源”和“资源本地”数据源之间的区别?

2022-08-31 17:19:05

术语“jta-datasource”和“resource-local datasource”对我来说有点模糊。我正在放下我所理解的(或假设),我希望你说我在哪里是对的/错的。

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

谢谢!


答案 1

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

我猜你实际上指的是 和 元素。总之:jta-datasourcenon-jta-datasource

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

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

  • 如果被提及为jta数据源,那么bean /其他类可以使用JTA。因此,用户事务接口。

第一部分是正确的,最后一部分不完全是正确的。来自 EJB 3.0 规范的第 13.3.4 节 使用容器管理的事务划分的企业 Bean

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

16.12 节用户事务接口

容器不得使接口可供不允许使用此接口的企业 Bean 使用。UserTransaction

换句话说,该接口不可用于 CMT 企业 Bean。UserTransaction

  • 如果数据源是资源本地的,则无法使用 CMT/BMT

这里的措辞有点令人困惑,但我想说这不是严格正确的。来自 JPA 1.0 规范, § 5.5 控制事务

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

...

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

6.2.1.2 节事务类型

该属性用于指定实体管理器工厂为持久性单元提供的实体管理器必须是 JTA 实体管理器还是资源本地实体管理器。此元素的值为 或 。事务类型的 JTA 假定将提供 JTA 数据源 — 由元素指定或由容器提供。通常,在 Java EE 环境中,a 假定将提供非 JTA 数据源。在 Java EE 环境中,如果未指定此元素,那么缺省值为 JTA。transaction-typeJTARESOURCE_LOCALjta-data-sourcetransaction-typeRESOURCE_LOCAL

因此,您可以使用应用程序托管的实体管理器,它可以是资源本地实体管理器(在这种情况下,您必须注入 a 才能从中获取 EM),并且它不会成为 JTA 事务的一部分。请参阅此(非常有趣)讨论EntityManagerFactory

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

同样,措辞有点令人困惑,但我会说这是正确的。


答案 2

推荐