【问题标题】:XAException in Websphere Application ServerWebsphere 应用程序服务器中的 XAException
【发布时间】:2013-09-12 05:42:48
【问题描述】:

我遇到了一个令人困惑的问题,希望有人能帮助我。在尝试部署到我们的 IBM Websphere Application Server 实例的一些代码时,我遇到了这个异常。有趣的是,这可以在本地工作(使用 Atomikos for JTA 在 Tomcat 上运行)

有什么想法吗?

错误信息

[9/8/13 12:33:53:726 EDT] 0000023e WSRdbXaResour E   DSRA0304E:  XAException occurred. XAException contents and details are: 
The XA Error is            : -3
The XA Error message is    : A resource manager error has occured in the transaction branch.
The Oracle Error code is   : 2045
The Oracle Error message is: Internal XA Error
The cause is               : null.
[9/8/13 12:33:53:757 EDT] 0000023e WSRdbXaResour E   DSRA0302E:  XAException occurred.  Error code is: XAER_RMERR (-3).  Exception is: <null>

系统详情

  • WAS 版本:8.5.0.0
  • Oracle 驱动程序版本:11.2.0.3.0
  • Oracle 数据库版本:11.2.0.3.0
  • 操作系统:AIX 6.1 ppc64
  • 春季版:3.2.3
  • 休眠版本:4.1.9
  • Javassist 版本:3.17.1-GA

堆栈跟踪(在第一次调用我的一项服务时被截断)

[9/8/13 12:33:53:634 EDT]     FFDC Exception:oracle.jdbc.xa.OracleXAException SourceId:com.ibm.ws.rsadapter.spi.WSRdbXaResourceImpl.start ProbeId:639 Reporter:com.ibm.ws.rsadapter.spi.WSRdbXaResourceImpl@12c29f91
oracle.jdbc.xa.OracleXAException
    at oracle.jdbc.xa.OracleXAResource.checkError(OracleXAResource.java:1110)
    at oracle.jdbc.xa.client.OracleXAResource.start(OracleXAResource.java:240)
    at com.ibm.ws.rsadapter.spi.WSRdbXaResourceImpl.start(WSRdbXaResourceImpl.java:1536)
    at com.ibm.ejs.j2c.XATransactionWrapper.start(XATransactionWrapper.java:1478)
    at com.ibm.ws.Transaction.JTA.JTAResourceBase.start(JTAResourceBase.java:153)
    at com.ibm.tx.jta.impl.RegisteredResources.startRes(RegisteredResources.java:1001)
    at com.ibm.ws.tx.jta.RegisteredResources.enlistResource(RegisteredResources.java:1114)
    at com.ibm.ws.tx.jta.TransactionImpl.enlistResource(TransactionImpl.java:2186)
    at com.ibm.tx.jta.embeddable.impl.EmbeddableTranManagerSet.enlist(EmbeddableTranManagerSet.java:154)
    at com.ibm.ejs.j2c.XATransactionWrapper.enlist(XATransactionWrapper.java:732)
    at com.ibm.ejs.j2c.ConnectionManager.lazyEnlist(ConnectionManager.java:2678)
    at com.ibm.ws.rsadapter.spi.WSRdbManagedConnectionImpl.lazyEnlist(WSRdbManagedConnectionImpl.java:2591)
    at com.ibm.ws.rsadapter.jdbc.WSJdbcConnection.beginTransactionIfNecessary(WSJdbcConnection.java:740)
    at com.ibm.ws.rsadapter.jdbc.WSJdbcConnection.prepareStatement(WSJdbcConnection.java:2789)
    at com.ibm.ws.rsadapter.jdbc.WSJdbcConnection.prepareStatement(WSJdbcConnection.java:2742)
    at sun.reflect.GeneratedMethodAccessor112.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
    at java.lang.reflect.Method.invoke(Method.java:611)
    at org.hibernate.engine.jdbc.internal.proxy.ConnectionProxyHandler.continueInvocation(ConnectionProxyHandler.java:138)
    at org.hibernate.engine.jdbc.internal.proxy.AbstractProxyHandler.invoke(AbstractProxyHandler.java:81)
    at $Proxy139.prepareStatement(Unknown Source)
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$5.doPrepare(StatementPreparerImpl.java:147)
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:166)
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl.prepareQueryStatement(StatementPreparerImpl.java:145)
    at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1854)
    at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1831)
    at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1811)
    at org.hibernate.loader.Loader.doQuery(Loader.java:899)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:341)
    at org.hibernate.loader.Loader.doList(Loader.java:2516)
    at org.hibernate.loader.Loader.doList(Loader.java:2502)
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2332)
    at org.hibernate.loader.Loader.list(Loader.java:2327)
    at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:490)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:355)
    at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:195)
    at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1247)
    at org.hibernate.internal.QueryImpl.list(QueryImpl.java:101)
    at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:264)
    at org.hibernate.ejb.criteria.CriteriaQueryCompiler$3.getResultList(CriteriaQueryCompiler.java:254)
    at ca.statcan.icos.admin.service.WorkAssignmentBusinessService.getOperationalSupervisors(WorkAssignmentBusinessService.java:180)
<snip>

提前致谢

【问题讨论】:

  • 可能是这个失败:oracle.errorcodeslist.com/…尝试在所有参与事务的Oracle数据源上设置Oracle驱动属性transactionBranchesLooselyCoupled=true。
  • 顺便说一句,我不确定上述属性是否可行,看来您在同一个 XA 上下文中征用了太多事务...
  • 谢谢罗班!如果没有别的,它给了我一些东西来研究。我会及时通知你它是否有效。
  • 我尝试设置属性,但无济于事。我已将问题隔离到 Oracle XA 数据源。我们在本地使用非 XA 数据源,这就是为什么功能看起来运行良好但我们部署到具有 XA 数据源的服务器的原因。

标签: java oracle hibernate websphere websphere-8


【解决方案1】:

在大多数情况下,当您处理 Oracle 和 WAS XA 数据源时,IBM 支持人员会建议向 Oracle 用户授予特殊权限。

这是必需的赠款:

 grant select on pending_trans$ to <user>; 
 grant select on dba_2pc_pending to <user>;
 grant select on dba_pending_transactions to <user>;
 grant execute on dbms_system to <user>;  (If using Oracle 10.2.0.3 or lower JDBC driver)
 grant execute on dbms_xa to <user>; (If using Oracle 10.2.0.4 or higher JDBC driver)

【讨论】:

  • 我找到了IBM TechNote
  • 我们很早就这样做了。我们的数据库是 Oracle 11g,尽管默认情况下 XA 支持处于启用状态,但无论哪种方式都不需要这些。不过还是谢谢。
【解决方案2】:

事实证明,问题根本不在于 WebSphere 或 Oracle,而在于我们的配置。我们使用 Spring AOP 进行事务处理。在部署到 WebSphere 之前,我们还合并了几个 Web 项目。在合并期间,我们最终得到了几个(准确地说是 9 个)用于设置 AOP 的 applicationContext.xml 文件。因此,对于包含在事务中的方法的每次调用,我们都会创建 9 个事务。

最终,我们达到了 Oracle 对可以参与单个事务的全局事务数量的限制,并且出现了这个错误。

明智的说法...小心 AOP 托管事务 :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-25
    • 1970-01-01
    • 2011-11-30
    • 2017-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-26
    相关资源
    最近更新 更多