oracle - 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);
有人可以就此提出建议吗?由于我们的生产环境中的这个错误,我们面临很多失败。到目前为止,无法找出任何根本原因。
解决方案
推荐阅读
- excel - 如何在 Microsoft Excel VBA 中进行计算?
- arrays - 使用 Vuejs 和 Axios 合并对象
- javascript - 带有警报的jQuery表单验证器OnSuccess不起作用
- graphql - Why use Prisma in a backend environment?
- vapor - Vapor 应用程序在启动时崩溃。VaporS3Signer.Provider.S3ProviderError.config("没有 vapor-S3Signer.json 配置文件")
- firebase - 如何将 Firebase 项目实施到另一个帐户?
- c - C - Characters not displayed correctly in output
- javascript - React Javascript onclick outside div
- r - Extract specific word
- android - 奥利奥停止前台服务