术语“jta-datasource”和“resource-local datasource”对我来说有点模糊。我正在放下我理解(或假设)的内容,我希望你能说出我对错的地方。
谢谢!
答案 0 :(得分:65)
术语“jta-datasource”和“resouce-local datasource”对我来说有点模糊。
我猜你实际上是指jta-datasource
和non-jta-datasource
元素。简而言之:
jta-datasource
元素用于声明将用于获取连接的JTA数据源的JNDI名称。这是常见的情况。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实体管理器或资源本地实体管理器。此元素的值为JTA
或RESOURCE_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接口
同样,措辞有点令人困惑,但我会说这是正确的。