“jta-datasource”和“资源本地”数据源之间的区别?
术语“jta-datasource”和“资源本地数据源”对我来说有点模糊。 我正在放下我所理解的(或者假设),我希望你能说出我对错的地方。
- 同一个数据库可以被称为一个jta数据源或作为一个资源本地数据源
- 如果提到的是jta-datasource,那么beans /其他类可以使用JTA。 因此,UserTransaction接口
- 如果数据源是本地资源,则不能使用CMT / BMT
- 如果提到资源本地数据源,交易不是JTA意识到的。 代码可以使用EntityTransaction接口,但不能使用UserTransaction接口
谢谢!
术语“jta-datasource”和“资源本地数据源”对我来说有点模糊。
我想你实际上指的是jta-datasource
和non-jta-datasource
元素。 简而言之:
- 如果持久性单元的事务types是JTA ,则使用
jta-datasource
元素来声明将用于获取连接的JTA数据源的JNDI名称。 这是常见的情况。 - 如果持久化单元的事务types是资源本地的 ,则应使用
non-jta-data-source
来声明非JTA数据源的JNDI名称。
- 同一个数据库可以被称为一个jta数据源或作为一个资源本地数据源
这是对的。 我没有提到上面的内容,但是有些提供者甚至允许声明一个jta-datasource
和一个non-jta-datasource
并且使用后者来优化通过非JTA连接的读取(即不会被关联到一个正在进行的JTA交易)。
- 如果提到的是jta-datasource,那么beans /其他类可以使用JTA。 因此,UserTransaction接口。
第一部分是正确的,最后一部分不完全是。 从EJB 3.0规范中,第13.3.4节“ 使用容器pipe理的事务划分的企业Bean”
企业bean的业务方法不能试图获取或使用
javax.transaction.UserTransaction
接口。
和第16.12节UserTransaction接口 :
容器不能使
UserTransaction
接口可用于不允许使用此接口的企业bean。
换句话说, UserTransaction
接口不可用于CMT企业bean。
- 如果数据源是本地资源,则不能使用CMT / BMT
在这里的措辞有点混乱,但我会说这不是严格正确的。 从JPA 1.0规范的第5.5节“控制事务 :
应用程序pipe理的实体pipe理器可以是JTA实体pipe理器或资源本地实体pipe理器。
…
Java EE Web容器和EJB容器都需要支持JTA实体pipe理器和资源本地实体pipe理器。 在EJB环境中,通常使用JTA实体pipe理器。
和第6.2.1.2节交易types
transaction-type
属性用于指定实体pipe理器工厂为持久化单元提供的实体pipe理器是否必须是JTA实体pipe理器或资源本地实体pipe理器。 此元素的值是JTA
或RESOURCE_LOCAL
。 JTA的事务types假定将提供JTA数据源 – 要么由jta-data-source
元素指定,要么由容器提供。 通常,在Java EE环境中,transaction-type
的RESOURCE_LOCAL
假定将提供非JTA数据源。 在Java EE环境中,如果未指定此元素,则默认为JTA。
所以你可以使用一个应用程序pipe理的实体pipe理器 ,它可以是一个资源本地的实体pipe理器 (在这种情况下你必须注入一个EntityManagerFactory
来从中获取EM),它不会成为JTA事务的一部分。 看到这个(非常有趣)的讨论 。
- 如果提到资源本地数据源,交易不是JTA意识到的。 代码可以使用EntityTransaction接口,但不能使用UserTransaction接口
再次,措辞有点混乱,但我会说这是正确的。