在JBoss / WildFly中,我应该在数据源上启用JTA以与JPA一起使用吗?

时间:2014-04-03 03:47:23

标签: jpa jboss datasource jta wildfly

在JBoss / WildFly中,配置数据源时,有一个JTA选项,默认情况下被禁用:

<datasource jta="false" jndi-name="java:/wt/testds" pool-name="testds" enabled="true" use-ccm="false">  
...  
</datasource> 

现在我想使用JTA事务类型将此数据源与JPA关联:

<?xml version="1.0" encoding="UTF-8"?>  
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence"  
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">  
    <persistence-unit name="test" transaction-type="JTA">  
        <jta-data-source>java:/wt/testds</jta-data-source>  
    </persistence-unit>  
</persistence>  

我是否还需要在数据源上启用JTA?

3 个答案:

答案 0 :(得分:3)

是的,如果你想进行jta交易,你当然需要在数据源上启用JTA!

您的XML / JBoss / Wildfly配置文件如下所示:

<datasource jta="true" ...

在我们的webapp持久性单元中,数据源如下所示:

<jta-data-source>java:jboss/datasources/CoreDS</jta-data-source>

transaction-type="JTA"不是必需的,至少不在我的设置中(Wildfly 8.1)。

在您的Java代码中,您可以像这样使用事务:

@TransactionManagement(TransactionManagementType.CONTAINER) // class level
public class ...
...
    @PersistenceContext(unitName = "CoreJPA")
    EntityManager em;

    @Resource
    private EJBContext ejbContext;
...
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) // method level
public void doSomething(...)

如果你需要回滚,你可以这样做:

try {
  ...
} catch (Throwable t) {
    log.error("Exception in create work order: " + t.getMessage());
    ejbContext.setRollbackOnly();
    throw t;
}

有很多关于此的资源可以通过Google找到。

答案 1 :(得分:1)

我刚遇到与此问题相关的问题。

我正在运行一个容器管理的事务,涉及大约20,000个插入MySQL数据库。

交易随机失败,有时在大约3,500次插入后,其他时间大约6,000次插入等等。

经过调查,我发现WildFly数据源定义中的JTA选项设置为false。

将此设置更改为true可解决此问题,因此我同意@ user3472929在数据源定义中应将JTA设置为true,除非您有某些特定原因不这样做。

答案 2 :(得分:0)

我认为你应该使用jta。如果在容器配置文件中将jta设置为false,则JPA将禁用jta,因此JPA的事务类型将为&#34; RESOURCE_LOCAL&#34;,这会产生一些令人讨厌的副作用。顺便说一句,默认情况下,jta在容器配置文件中为true。