57

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

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

谢谢!

4

1 回答 1

71

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

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

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

这是对的。而且我没有在上面提到这一点,但是一些提供者甚至允许同时声明 ajta-datasource anon-jta-datasource并使用后者来优化通过非 JTA 连接的读取(即,这不会与正在进行的 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 实体管理器或资源本地实体管理器。

...

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

第 6.2.1.2 节事务类型

The transaction-type attribute is used to specify whether the entity managers provided by the entity manager factory for the persistence unit must be JTA entity managers or resource-local entity managers. The value of this element is JTA or RESOURCE_LOCAL. A transaction-type of JTA assumes that a JTA data source will be provided — either as specified by the jta-data-source element or provided by the container. In general, in Java EE environments, a transaction-type of RESOURCE_LOCAL assumes that a non-JTA datasource will be provided. In a Java EE environment, if this element is not specified, the default is JTA.

So you CAN use an application managed entity manager which can be a resource-local entity manager (you must inject an EntityManagerFactory to get the EM from it in that case) and it won't be part of a JTA transaction. See this (very interesting) discussion.

  • If mentioned as resource local datasource, transactions are not JTA aware. Code can use EntityTransaction interface but not UserTransaction interface

Again, the wording is a bit confusing but I'd say that this is correct.

于 2010-07-10T06:54:30.597 回答