0

我有一个包含 4 个 MDB 的应用程序,每个 MDB 通过 JMS 从 MQ 接收 SOAP 消息。收到消息后,我们将 XML 处理为对象模型并进行相应的处理,这始终涉及通过 Hibernate 将消息加载或保存到 Oracle 数据库。

此外,我们有一个石英进程,每分钟触发一次,可能会触发也可能不会触发这些动作,这些动作也可以使用 Hibernate 读取或写入数据库。

当系统处于高负载下时,即处理大量 1k + 并可能执行由我们的石英进程触发的一些数据库读/写,我们不断看到在我们的日志中抛出以下异常。

==================================================== ============================= 在 com.integrasp.iatrade.logic.MessageContextRouting.lookup(MessageContextRouting.java:150) 在 com .integrasp.iatrade.logic.RequestResponseManager.findRequestDestination(Reque stResponseManager.java:153) 在 com.integrasp.iatrade.logic.RequestResponseManager.findRequestDestination(请求 stResponseManager.java:174) 在 com.integrasp.iatrade.logic.IOLogic.processResponse (IOLogic.java:411)< br /> 在 com.integrasp.iatrade.logic.FxOrderQuoteManager.requestQuote(FxOrderQuoteManage r.java:119) 在 com.integrasp.iatrade.logic.FxOrderQuoteManager.processRequest(FxOrderQuoteMana ger.java:682) ) 在 com.integrasp.iatrade.eo.SubmitOrderRequest.process(SubmitOrderRequest.java:60) 在 com.integrasp.iatrade.ejb.BusinessLogicRegister.perform(BusinessLogicRegister.j ava:85) 在 com.integrasp.iatrade.ejb.mdb.OrderSubmissionBean.onMessage(OrderSubmissionBean .java:147) 在 com.ibm.ejs。 jms.listener.MDBWrapper$PriviledgedOnMessage.run(MDBWrapper.java:30 2) 在 com.ibm.ws.security.util.AccessController.doPrivileged(AccessController.java:63) 在 com.ibm.ejs.jms.listener.MDBWrapper .callOnMessage(MDBWrapper.java:271) 在 com.ibm.ejs.jms.listener.MDBWrapper.onMessage(MDBWrapper.java:240) 在 com.ibm.mq.jms.MQSession.run(MQSession.java:1593) 在com.ibm.ejs.jms.JMSSessionHandle.run(JMSSessionHandle.java:970) 在 com.ibm.ejs.jms.listener.ServerSession.connectionConsumerOnMessage(ServerSessio n.java:891) 在 com.ibm.ejs.jms.listener .ServerSession.onMessage(ServerSession.java:656) 在 com.ibm.ejs.jms.listener.ServerSession.dispatch(ServerSession.java:623) 在 sun.reflect.GeneratedMethodAccessor79.invoke(Unknown Source) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.ja va:43) 在 java.lang.reflect.Method.invoke(Method.java:615) 在com.ibm.ejs.jms.listener.ServerSessionDispatcher.dispatch(ServerSessionDispatch er.java:37) 在 com.ibm.ejs.container.MDBWrapper.onMessage(MDBWrapper.java:96) 在 com.ibm.ejs.container.MDBWrapper .onMessage(MDBWrapper.java:132) 在 com.ibm.ejs.jms.listener.ServerSession.run(ServerSession.java:481) 在 com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1473 ) 引起:java.lang.reflect.Method.invoke( Method.java:615) 在 org.hibernate。transaction.WebSphereExtendedJTATransactionLookup$TransactionMana gerAdapter$TransactionAdapter.registerSynchronization(WebSphereExtendedJTATransa ctionLookup.java:225) ... 30 更多原因:com.ibm.websphere.jtaextensions.NotSupportedException at com.ibm.ws.jtaextensions.ExtendedJTATransactionImpl.registerSynchronizationCall backForCurrentTran(ExtendedJTATransactionI .java:247)

... 34 更多

任何机构都可以帮助阐明 com.ibm.websphere.jtaextensions.NotSupportedException 的含义。IBM 文档说

“如果尝试在环境中注册 SynchronizationCallback 或在此功能不可用时,事务管理器会抛出异常。”

对我来说,这听起来像是容器拒绝休眠调用以启动事务。如果有人对容器为什么会抛出消息有任何想法,请告诉我。

提前致谢

卡尔

4

2 回答 2

0

如果你真的需要高负载,我会删除你的应用程序和数据库之间的 Hibernate 层。如果没有 Hibernate,您将拥有更少的移动部件和更多的控制权。

这是我能给你的唯一建议。

于 2009-01-14T16:58:18.283 回答
0

如果有人感兴趣,那是在事务超时时尝试同步事务的线程。

我曾假设如果事务超时,那么线程将被杀死,但事实并非如此。

卡尔

于 2009-02-23T20:47:09.067 回答