我测试了从JBoss AS 7.0.1到最终版Wild Fly 8.2.0的迁移。
原因:导致数据库死锁的log4j错误;只能在JBoss EAP中解决的错误,我不能使用=>那么Wild Fly似乎是一个不错的选择

我正在将 XA数据源一起使用JTA事务管理器

JBoss AS 7.x和Wild Fly 8.2.x之间的配置(standalone.xml)似乎相同:

资料来源1

    <datasource jta="true" jndi-name="java:/DS_Habilitation" pool-name="DS_Habilitation" enabled="true" use-java-context="true" use-ccm="true">
                <connection-url>jdbc:sqlserver://localhost:1433;instanceName=*****;databaseName=Habilitations_DV</connection-url>
                <driver>sqlserver</driver>
                <pool>
                    <min-pool-size>10</min-pool-size>
                    <max-pool-size>100</max-pool-size>
                    <prefill>true</prefill>
                    <use-strict-min>false</use-strict-min>
                    <flush-strategy>FailingConnectionOnly</flush-strategy>
                </pool>
                <security>
                    <user-name>*****</user-name>
                    <password>*******</password>
                </security>
            </datasource>

资料来源2
        <datasource jta="true" jndi-name="java:/DS_Referentiel" pool-name="DS_Referentiel" enabled="true" use-java-context="true" use-ccm="true">
            <connection-url>jdbc:sqlserver://localhost:1433;instanceName=*****;databaseName=Referentiel_DV</connection-url>
            <driver>sqlserver</driver>
            <pool>
                <min-pool-size>10</min-pool-size>
                <max-pool-size>100</max-pool-size>
                <prefill>true</prefill>
                <use-strict-min>false</use-strict-min>
                <flush-strategy>FailingConnectionOnly</flush-strategy>
            </pool>
            <security>
                <user-name>*****</user-name>
                <password>******</password>
            </security>
        </datasource>

数据源3
<datasource jta="true" jndi-name="java:/DS_Sinistre" pool-name="DS_Sinistre" enabled="true" use-java-context="true" use-ccm="true">
                    <connection-url>jdbc:sqlserver://localhost:1433;instanceName=****;databaseName=Sinistres_DV</connection-url>
                    <driver>sqlserver</driver>
                    <pool>
                        <min-pool-size>10</min-pool-size>
                        <max-pool-size>100</max-pool-size>
                        <prefill>true</prefill>
                        <use-strict-min>false</use-strict-min>
                        <flush-strategy>FailingConnectionOnly</flush-strategy>
                    </pool>
                    <security>
                        <user-name>******</user-name>
                        <password>******</password>
                    </security>
                </datasource>

我启动Wild Fly并正确部署我的WAR
登录时,我调用2个数据源,但出现错误:
ARJUNA012140: Adding multiple last resources is disallowed. Trying to add LastResourceRecord(XAOnePhaseResource

我通过添加“Wild Fly”服务器配置文件standalone.xml解决了这一问题:
   <system-properties>
      <property name="com.arjuna.ats.arjuna.allowMultipleLastResources" value="true"/>
   </system-properties>

然后我有警告指示我交易不安全,因为我有多个数据源
WARN  [com.arjuna.ats.arjuna] (default task-27) ARJUNA012141: Multiple last resources have been added to the current transaction. This is transactionally unsafe and should not be relied upon. Current resource is LastResourceRecord(XAOnePhaseResource(

供参考,我的服务是这样的(1笔交易)
@Service("gestionnaireService") @Transactional(value="transactionManager")

    public class GestionnaireServiceImpl implements GestionnaireService {

        @Autowired
        private UtilisateurService utilisateurService;

        @Autowired
        private GestionnaireDao gestionnaireDao;
    .....
    }

数据源如下:
<bean id="dataSourceReferentiel" class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiName" value="java:/DS_Referentiel" />
    </bean>
...
<bean id="sessionFactoryReferentiel" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSourceReferentiel" />
        <property name="mappingResources">
            <list>
                <value>hibernate/referentiel/DonneeReference.hbm.xml</value>
                <value>hibernate/referentiel/LibelleReference.hbm.xml</value>
                <value>hibernate/referentiel/Localite.hbm.xml</value>
                <value>hibernate/referentiel/Banque.hbm.xml</value>
            </list>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop>
                <prop key="hibernate.generate_statistics">false</prop>
                <prop key="hibernate.transaction.manager_lookup_class">org.hibernate.transaction.JBossTransactionManagerLookup</prop>
                <prop key="hibernate.show_sql">false</prop>
                <!-- <prop key="transaction.flush_before_completion">true</prop>-->
                <prop key="hibernate.cache.use_query_cache">true</prop>
                <!-- Level 2 cache -->
                <prop key="hibernate.cache.use_second_level_cache">true</prop>
                <prop key="hibernate.cache.region.factory_class" >org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory</prop>
            </props>
        </property>
    </bean>
...
<!-- Transaction manager -->
    <bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"/>
  • 第一点是使用JBoss AS7,我没有这个问题,我应该拥有
  • 2nd我想知道我的数据源是否已正确配置(XA)还是它是我的服务,...

  • 你能给我你的意见吗?

    谢谢

    最佳答案

    好的,谢谢您的评论。我设法通过使用不同数据源在服务上设置单独的事务来避免警告

    @Service @Transactional(value="transactionManager", propagation=Propagation.REQUIRES_NEW)
    public class ReferenceServiceImpl implements ReferenceService {
    
        @Autowired
        private ReferenceDao dao;
    ...
    }
    

    我已经测试过,如果在此过程中失败,则会回滚所有事务:很好

    我最后的反射Reflection 是我是否真的需要设置XA数据源。我的模式由我使用相同的数据库实例分隔。不知道我们是否有一天会在不同的机器上设置Shemas。

    无论如何,我要感谢这个社区提供的帮助。

    10-01 00:20
    查看更多