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

时间:2010-07-10 02:29:24

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

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

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

谢谢!

1 个答案:

答案 0 :(得分:65)

  

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

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

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

这是对的。我刚才没有提到,但有些提供商甚至允许声明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.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环境中,transaction-type RESOURCE_LOCAL假定将提供非JTA数据源。在Java EE环境中,如果未指定此元素,则默认值为JTA。

因此,您可以使用应用程序管理实体管理器,它可以是资源本地实体管理器(您必须注入EntityManagerFactory才能从中获取EM在那种情况下)它不会成为JTA交易的一部分。请参阅this (very interesting) discussion

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

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