"jta-datasource"和"resource-local"数据源之间的区别?

str*_*ine 53 java jpa jta java-ee ejb-3.0

术语"jta-datasource"和"resource-local datasource"对我来说有点模糊.我正在放下我理解(或假设)的内容,我希望你能说出我对错的地方.

  • 相同的数据库可以称为jta-datasource或资源本地数据源
  • 如果提到jta-datasource,则bean /其他类可以使用JTA.因此,UserTransaction接口
  • 如果数据源是本地资源,则无法使用CMT/BMT
  • 如果提到资源本地数据源,则事务不能识别JTA.代码可以使用EntityTransaction接口,但不能使用UserTransaction接口

谢谢!

Pas*_*ent 68

术语"jta-datasource"和"resouce-local datasource"对我来说有点模糊.

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

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

这是对的.我没有提到上面的内容,但有些提供商甚至允许声明a jta-datasource a,non-jta-datasource并使用后者通过非JTA连接进行优化读取(即不会与正在进行的JTA事务关联).

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

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

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

和第16.12UserTransaction接口:

容器不得使UserTransaction接口可用于不允许使用此接口的企业bean.

换句话说,UserTransactionCMT企业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环境,一个transaction-typeRESOURCE_LOCAL假设非JTA的数据源将提供.在Java EE环境中,如果未指定此元素,则默认值为JTA.

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

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

再一次,措辞有点令人困惑,但我会说这是正确的.