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