【问题标题】:In JBoss/WildFly should I enable JTA on data source to use with JPA?在 JBoss/WildFly 中,我应该在数据源上启用 JTA 以与 JPA 一起使用吗?
【发布时间】:2014-05-14 16:23:01
【问题描述】:

在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?

【问题讨论】:

  • 与其他答案一样,我建议将其设置为 true。我刚刚花了很多时间调试一个回滚不起作用的问题,因为它被设置为 false。详情:stackoverflow.com/questions/16897063/…

标签: jpa jboss datasource jta wildfly


【解决方案1】:

我认为你应该使用 jta。如果在容器配置文件中将 jta 设置为 false,JPA 将禁用 jta,因此 JPA 的 transaction-type 将是“RESOURCE_LOCAL”,这会产生一些讨厌的副作用。顺便说一句,容器配置文件中jta默认为true。

【讨论】:

    【解决方案2】:

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

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

    事务随机失败,有时在大约 3,500 次插入之后,有时在大约 6,000 次插入之后,等等。

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

    将此设置更改为 true 可以解决问题,因此我同意 @user3472929 的观点,即 JTA 应在数据源定义中设置为 true,除非您有特定的理由不这样做。

    【讨论】:

      【解决方案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 可以找到很多关于此的资源。

      【讨论】:

        猜你喜欢
        • 2015-12-24
        • 1970-01-01
        • 1970-01-01
        • 2015-03-30
        • 1970-01-01
        • 2021-06-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多