首页 > 解决方案 > AtomikosDataSourceBean:com.atomikos.datasource.ResourceException:XID 的 XA 资源恢复引发 -3:XA 资源检测到内部错误

问题描述

我有一个在 openshift 环境中运行的 spring 批处理应用程序。数据库:Oracle 19c,JTA:1.1,Atomikos:4.0.6

最近我们在生产环境中面临以下问题。由于春季批处理作业失败并且会话在数据库中被挂起。

"com.atomikos.datasource.ResourceException: XA resource 'XXX': resume for XID '31302E36322E3137302E32322E746D313632393931353739343632323038383734:31302E36322E3137302E32322E746D313036313932' raised -3: the XA resource detected an internal error at com.atomikos.datasource.xa.XAResourceTransaction.resume(XAResourceTransaction.java :303) com.atomikos.datasource.xa.session.BranchEnlistedStateHandler.(BranchEnlistedStateHandler.java:40) com.atomikos.datasource.xa.session.NotInBranchStateHandler.checkEnlistBeforeUse(NotInBranchStateHandler.java:46) com.atomikos.datasource .xa.session.TransactionContext.checkEnlistBeforeUse(TransactionContext.java:70) 在 com.atomikos.datasource.xa.session.SessionHandleState.notifyBeforeUse(SessionHandleState.java:160) 在 com.atomikos.jdbc.AtomikosConnectionProxy.enlist(AtomikosConnectionProxy.java:207) at com.atomikos.jdbc.AtomikosConnectionProxy.invoke(AtomikosConnectionProxy.java:122) at com.sun.proxy.$Proxy7.prepareStatement(Unknown Source) at org.springframework.jdbc.core.PreparedStatementCreatorFactory$PreparedStatementCreatorImpl.createPreparedStatement (PreparedStatementCreatorFactory.java:246) 在 org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:695) 在 org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:638)。 jdbc.core.JdbcTemplate.query(JdbcTemplate.java:722) at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:772) at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.query(NamedParameterJdbcTemplate.query(JdbcTemplate.java:772) java:192) 在 org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.queryForList(NamedParameterJdbcTemplate.java:290) 在 org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.queryForList(NamedParameterJdbcTemplate.java:297) 在 com.sample.poc.internal.db.etl.QueryBuilderAndRunner.getSourceRepresentation(QueryBuilderAndRunner.java:324) 在 sun.reflect.GeneratedMethodAccessor99.invoke( Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils. java:343) 在 org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198) 在 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.j"297) 在 com.sample.poc.internal.db.etl.QueryBuilderAndRunner.getSourceRepresentation(QueryBuilderAndRunner.java:324) 在 sun.reflect.GeneratedMethodAccessor99.invoke(Unknown Source) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java: 43) 在 java.lang.reflect.Method.invoke(Method.java:498) 在 org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343) 在 org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint (ReflectiveMethodInvocation.java:198) 在 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.j"297) 在 com.sample.poc.internal.db.etl.QueryBuilderAndRunner.getSourceRepresentation(QueryBuilderAndRunner.java:324) 在 sun.reflect.GeneratedMethodAccessor99.invoke(Unknown Source) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java: 43) 在 java.lang.reflect.Method.invoke(Method.java:498) 在 org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343) 在 org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint (ReflectiveMethodInvocation.java:198) 在 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.j"invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343) at org.springframework.aop .framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198) 在 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.j"invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343) at org.springframework.aop .framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198) 在 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.j"

JTA 属性:com.atomikos.icatch.log_base_dir=C:\logs

com.atomikos.icatch.service=com.atomikos.icatch.standalone.UserTransactionServiceFactory

com.atomikos.icatch.default_jta_timeout = 10000000

com.atomikos.icatch.serial_jta_transactions = false
com.atomikos.icatch.max_timeout = 30000000

XML:

    <bean id="transactionManager"
          class="org.springframework.transaction.jta.JtaTransactionManager">
        <property name="transactionManager" ref="txManager"/>
        <property name="nestedTransactionAllowed" value="true"/>
        <property name="allowCustomIsolationLevels" value="true"/>
        <property name="defaultTimeout" value="-1"/>   
   </bean>
   
   <bean id="txManager" class="com.atomikos.icatch.jta.UserTransactionManager" destroy-method="close">
        <property name="forceShutdown" value="true"/>
        <property name="transactionTimeout" value="60"></property> 
   </bean> 

AtomikosDataSourceBean ads = new AtomikosDataSourceBean();

    if (mDevModeDriverClassName.toLowerCase().contains("oracle")) {
        if (!mDevModeDriverClassName.equals("oracle.jdbc.xa.client.OracleXADataSource")) {
            log.warn("DataSource property 'devModeDriverClassName' should be set "
                    + "to 'oracle.jdbc.xa.client.OracleXADataSource' when using Oracle! " + "Current value is: "
                    + mDevModeDriverClassName);
        }
    }
    String vUniqueResourceName = "DS-" + UUID.randomUUID();
    log.debug("Creating Oracle XA DataSource. uniqueResourceName={}"+vUniqueResourceName);
    ads.setUniqueResourceName(vUniqueResourceName);
    ads.setXaDataSourceClassName(mDevModeDriverClassName); // "oracle.jdbc.xa.client.OracleXADataSource");
    ads.setMaxPoolSize((mDevModeMaxSize > 0) ? mDevModeMaxSize : 1);
    ads.setTestQuery("SELECT 1 FROM DUAL");
    
    Properties xaProps = new Properties();
    xaProps.setProperty("user", mDevModeUsername);
    xaProps.setProperty("password", mDevModePassword);
    xaProps.setProperty("URL", mDevModeJdbcUrl);
    ads.setXaProperties(xaProps); 
    
    OracleXADataSource xaDataSource = new OracleXADataSource();
    xaDataSource.setUser(mDevModeUsername);
    xaDataSource.setPassword(mDevModePassword);
    xaDataSource.setURL(mDevModeJdbcUrl);
      
    ads.setXaDataSource(xaDataSource);

有人可以就此提出建议吗?由于我们的生产环境中的这个错误,我们面临很多失败。到目前为止,无法找出任何根本原因。

标签: oraclespring-batchjtaatomikos

解决方案


推荐阅读