【问题标题】:Wild fly multiple datasource野飞多数据源
【发布时间】:2023-03-18 08:19:01
【问题描述】:

我正在测试从 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 我没有这个问题,而我应该有这个问题

  • 第二个我想知道我的数据源是否配置正确 (XA) 或者它是否是我的服务,...

你能给我你的意见吗?

谢谢

【问题讨论】:

  • 你说你用的是xa-datasources,但是你的datasources其实不是这样定义的,而是&lt;datasource&gt; ... &lt;/datasource&gt;。不应该是&lt;xa-datasource&gt;...&lt;/xa-datasource&gt; 吗?
  • 准确。如果 XA 数据源是我们想要的,我怀疑数据源声明是不正确的。 XA 是我们使用的项目的遗产。我想知道这是否真的有必要。我们的问题是我们有 3 个数据库架构,当我们处理所有架构时,我们需要确保事务的完整性。
  • 如果您需要在一个事务中访问三个数据库,您可能需要 XA
  • 我只需要确保在对不同模式进行修改的过程中,如果发生错误,所有内容都不会提交。
  • FWIW 只有在使用ConsoleAppender 时才会出现 log4j 死锁。它不会导致与数据库相关的任何事情发生死锁。

标签: java spring jboss wildfly


【解决方案1】:

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

@Service @Transactional(value="transactionManager", propagation=Propagation.REQUIRES_NEW)
public class ReferenceServiceImpl implements ReferenceService {

    @Autowired
    private ReferenceDao dao;
...
}

我已经测试过,如果在这个过程中失败了,所有的事务都会回滚:很好

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

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

【讨论】:

    猜你喜欢
    • 2023-03-06
    • 1970-01-01
    • 2022-07-26
    • 1970-01-01
    • 2019-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多