Java 由于使用两个消息驱动器bean更新同一个表而导致超时,事务结束
我使用两个消息驱动bean(MDB)来更新同一个表。我使用EJB3.0并使用事务类型作为Java 由于使用两个消息驱动器bean更新同一个表而导致超时,事务结束,java,ejb,Java,Ejb,我使用两个消息驱动bean(MDB)来更新同一个表。我使用EJB3.0并使用事务类型作为 @TransactionAttribute(TransactionAttributeType.REQUIRES\u NEW) 有时,其中一个方法会出现错误,如“事务因超时而结束”,MDB会被停用。因此,我必须重新启动服务器 我可以使用任何其他类型的事务属性@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)来避免超时错误吗 这是我的追踪
@TransactionAttribute(TransactionAttributeType.REQUIRES\u NEW)
有时,其中一个方法会出现错误,如“事务因超时而结束”,MDB会被停用。因此,我必须重新启动服务器
我可以使用任何其他类型的事务属性@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
来避免超时错误吗
这是我的追踪
[:]CWWMQ0007W:系统已暂停消息端点Rsme#RsmeEJB.jar#geminqmdb。向终结点传递消息失败超过0次。上次尝试的传递失败,出现以下错误:javax.ejb.EJBTransactionRolledbackException:事务回滚;嵌套异常为:javax.transaction.TransactionRolledbackException:由于超时,事务已结束
javax.transaction.TransactionRolledbackException:由于超时,事务已结束
位于com.ibm.tx.jta.impl.embeddedabletranmanagerimpl.completextimeout(embeddedabletranmanagerimpl.java:62)
位于com.ibm.tx.jta.impl.embeddedabletranmanagerset.completetextimeout(embeddedabletranmanagerset.java:85)
位于com.ibm.ejs.csi.TransactionControlImpl.CompleteTextimeout(TransactionControlImpl.java:1347)
位于com.ibm.ejs.csi.TranStrategy.postInvoke(TranStrategy.java:242)
位于com.ibm.ejs.csi.TransactionControlImpl.postInvoke(TransactionControlImpl.java:579)
位于com.ibm.ejs.container.EJSContainer.postInvoke(EJSContainer.java:4843)
在com.maybank.meaa.local.EJSLocal0SLMeaaEntityBean_877f3cd5.insertPD003Result(EJSLocal0SLMeaaEntityBean_877f3cd5.java)
位于com.maybank.meaa.mdbs.geminqmdb.onMessage(geminqmdb.java:75)
位于com.ibm.ejs.container.MessageEndpointHandler.invokeMdbMethod(MessageEndpointHandler.java:1163)
位于com.ibm.ejs.container.MessageEndpointHandler.invoke(MessageEndpointHandler.java:842)
在$Proxy27.onMessage(未知来源)
位于com.ibm.mq.connector.inbound.MessageEndpointWrapper.onMessage(MessageEndpointWrapper.java:131)
在com.ibm.mq.jms.MQSession$FacadeMessageListener.onMessage上(MQSession.java:147)
位于com.ibm.msg.client.jms.internal.JmsSessionImpl.run(JmsSessionImpl.java:2665)
位于com.ibm.mq.jms.MQSession.run(MQSession.java:862)
位于com.ibm.mq.connector.inbound.WorkImpl.run(WorkImpl.java:279)
位于com.ibm.ejs.j2c.work.WorkProxy.run(WorkProxy.java:608)
位于com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1650)
javax.ejb.EJBTransactionRolledbackException:事务回滚;嵌套异常为:javax.transaction.TransactionRolledbackException:由于超时,事务已结束
原因:javax.transaction.TransactionRolledbackException:事务因超时而结束
位于com.ibm.tx.jta.impl.embeddedabletranmanagerimpl.completextimeout(embeddedabletranmanagerimpl.java:62)
位于com.ibm.tx.jta.impl.embeddedabletranmanagerset.completetextimeout(embeddedabletranmanagerset.java:85)
位于com.ibm.ejs.csi.TransactionControlImpl.CompleteTextimeout(TransactionControlImpl.java:1347)
位于com.ibm.ejs.csi.TranStrategy.postInvoke(TranStrategy.java:242)
位于com.ibm.ejs.csi.TransactionControlImpl.postInvoke(TransactionControlImpl.java:579)
位于com.ibm.ejs.container.EJSContainer.postInvoke(EJSContainer.java:4843)
在com.maybank.meaa.local.EJSLocal0SLMeaaEntityBean_877f3cd5.insertPD003Result(EJSLocal0SLMeaaEntityBean_877f3cd5.java)
位于com.maybank.meaa.mdbs.geminqmdb.onMessage(geminqmdb.java:75)
位于com.ibm.ejs.container.MessageEndpointHandler.invokeMdbMethod(MessageEndpointHandler.java:1163)
位于com.ibm.ejs.container.MessageEndpointHandler.invoke(MessageEndpointHandler.java:842)
在$Proxy27.onMessage(未知来源)
位于com.ibm.mq.connector.inbound.MessageEndpointWrapper.onMessage(MessageEndpointWrapper.java:131)
在com.ibm.mq.jms.MQSession$FacadeMessageListener.onMessage上(MQSession.java:147)
位于com.ibm.msg.client.jms.internal.JmsSessionImpl.run(JmsSessionImpl.java:2665)
位于com.ibm.mq.jms.MQSession.run(MQSession.java:862)
位于com.ibm.mq.connector.inbound.WorkImpl.run(WorkImpl.java:279)
位于com.ibm.ejs.j2c.work.WorkProxy.run(WorkProxy.java:608)
位于com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1650)
.
使用相同的结构创建两个不同的表,以避免死锁,而不是对两个MDB使用相同的表。此错误通常由两种原因引起
1-EJB超时
2-数据源超时
您可以将两者配置为更大的值
1-WebSphere应用程序服务器>容器属性>事务服务
总事务生存期超时-这将是没有此属性的EJB的默认值
最大事务超时-这将是WAS管理的任何事务的最大值
2-数据源>>连接池
连接超时
未使用的超时
通常,选项1可以解决问题。为什么有两个MDB?这不应该是一个物体的责任吗?也许他们在互相僵持。还有什么写入该数据库?也许他们和其他人僵持了。是的,有时会有大量的信息。我们收到来自两个不同接口和两个不同队列的响应。您是否使用XA驱动程序进行JDBC连接?你应该。这将使从队列中取出消息并将其写入数据库成为一个单一的工作单元,而这一切都不是密切相关的。您的JDBC连接是否使用XA驱动程序?它是一个不同的类名:我使用oracle.jdbc.driver.OracleDriver,使用oracle作为数据库,我们可以使用两个不同的表。但问题是,我必须更改逻辑以在前端显示数据,并且需要将旧数据迁移到新表中。我认为,这不是一个正确的解决方案。