我有这个遗留应用程序,经常无法导入数据,可能是因为某些事务跨越了太多的sql语句。这些长事务确实不需要,所以我试图摆脱它们,只是使用正常的查找和提交。 我对XA数据源不是很熟悉,并且不太了解使用XA或非XA的控件。我在代码中找到了在XA和非XA之间选择的位置,但在设置为始终使用非XA之后,我仍然得到错误。 我还在我的服务器上的“队列连接工厂”中取消了“支持两阶段提交协议”,也没有运气。 我的服务器具有为XA和非XA注册的数据源。 任何关于如何以及在何处禁用XA数据源的帮助都将不胜感激。
LocalTransact E J2CA0030E: Method enlist caught com.ibm.ws.Transaction.IllegalResourceIn2PCTransactionException: Illegal attempt to enlist multiple 1PC XAResources
at com.ibm.ws.tx.jta.RegisteredResources.enlistResource(RegisteredResources.java:871)
at com.ibm.ws.tx.jta.TransactionImpl.enlistResource(TransactionImpl.java:1835)
at com.ibm.tx.jta.embeddable.impl.EmbeddableTranManagerSet.enlistOnePhase(EmbeddableTranManagerSet.java:202)
at com.ibm.ejs.j2c.LocalTransactionWrapper.enlist(LocalTransactionWrapper.java:624)
at com.ibm.ejs.j2c.ConnectionManager.lazyEnlist(ConnectionManager.java:2697)
at com.ibm.ws.rsadapter.spi.WSRdbManagedConnectionImpl.lazyEnlist(WSRdbManagedConnectionImpl.java:2605)
at com.ibm.ws.rsadapter.jdbc.WSJdbcConnection.beginTransactionIfNecessary(WSJdbcConnection.java:743)
at com.ibm.ws.rsadapter.jdbc.WSJdbcConnection.prepareStatement(WSJdbcConnection.java:2792)
at com.ibm.ws.rsadapter.jdbc.WSJdbcConnection.prepareStatement(WSJdbcConnection.java:2745)
答案 0 :(得分:2)
在回答这个问题之前,我想指出,在没有完全了解您正在做的事情的情况下更改事务逻辑会使您的应用程序面临数据完整性问题的风险,因此请谨慎行事。 如果查看堆栈中跟随您发布的内容的部分,则应显示使用java.sql.Connection对象的应用程序代码。按照代码返回指向从DataSource获取Connection的位置,并标识它正在使用的DataSource的JNDI名称。切换代码而不是使用ConnectionPoolDataSource(非XA)的JNDI名称而不是XADataSource。执行此操作后,您可能会看到有关在事务中登记多个单阶段资源的错误。如果是这样,您的应用程序依赖于两阶段提交,这只能通过XA进行,您需要完全重构它(如果可能的话),以避免使用两阶段提交。或者,如果真的意图是此数据源不应该在JTA事务中登记,那么您可以将其标记为transactional = false(如果使用Liberty)或nonTransactionalDataSource = true(WAS传统),在这种情况下它将避免参与JTA交易因此不会作为两阶段(XA)资源参与。
答案 1 :(得分:0)
在进行您不理解的更改之前,最好建议您评估是否只是修复或避免(未指定的)错误可能风险较小,而且从XA更改为非XA行为的工作量会减少。
至少从XA到非XA的这种变化,您应该聘请一位主题专家,他可以就所涉及的申请专门针对此类变更的技术和业务影响提供建议。
您应编辑问题以指定应用程序为响应哪种SQL操作而收到的确切错误(例如,sqlcodes或sqlstates)。有时简单的低风险配置更改可以解决这些错误。