在WAS + Spring + Hibernate事务回滚之后被异常吞噬 [英] Exception being swallowed after transaction rollback on WAS + Spring + Hibernate

查看:253
本文介绍了在WAS + Spring + Hibernate事务回滚之后被异常吞噬的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

场景:Spring 4.1.5.RELEASE; Hibernate 4.2.1.Final; WAS 8.5.5.5当数据库操作导致违例异常(例如:对于列的值太长)时,在提交期间抛出UnsupportedOperationException:

  WTRN0074E:从before_completion同步操作捕获到的异常:java.lang.UnsupportedOperationException 
在org.hibernate.service.jta.platform处。 internal.WebSphereExtendedJtaPlatform $ TransactionManagerAdapter.setRollbackOnly(WebSphereExtendedJtaPlatform.java:139)
处org.hibernate作为org.hibernate.engine.transaction.internal.jta.CMTTransaction.markRollbackOnly(CMTTransaction.java:131)
。 engine.transaction.internal.TransactionCoordinatorImpl.setRollbackOnly(TransactionCoordinatorImpl.java:306)
在org.hibernate.engine.transaction.synchronization.internal.SynchronizationCallbackCoordinatorImpl.setRollbackOnly(SynchronizationCallbackCoordinatorImpl.java:126)
。在组织。 hibernate.engine.transaction.synchronization.internal.SynchronizationCallbackCoo rdinatorImpl.beforeCompletion(SynchronizationCallbackCoordinatorImpl.java:116)
处org.hibernate.service.jta org.hibernate.engine.transaction.synchronization.internal.RegisteredSynchronization.beforeCompletion(RegisteredSynchronization.java:53)
。 platform.internal.WebSphereExtendedJtaPlatform $ TransactionManagerAdapter $ TransactionAdapter $ 1.invoke(WebSphereExtendedJtaPlatform.java:176)
。在com.sun.proxy。$ Proxy872.beforeCompletion(来源不明)
在com.ibm.ws.jtaextensions .SynchronizationCallbackWrapper.beforeCompletion(SynchronizationCallbackWrapper.java:66)
在com.ibm.tx.jta.impl.RegisteredSyncs.coreDistributeBefore(RegisteredSyncs.java:291)
在com.ibm.ws.tx.jta .RegisteredSyncs.distributeBefore(RegisteredSyncs.java:153)
at com.ibm.ws.tx.jta.TransactionImpl.prePrepare(TransactionImpl.java:2384)
at com.ibm.ws.tx.jta .TransactionImpl.stage1CommitProcessing(TransactionImpl.java:588)
at com.ibm.tx.jta.impl.TransactionImpl.processCommit(TransactionI mpl.java:1029)
at com.ibm.tx.jta.impl.TransactionImpl.commit(TransactionImpl.java:963)
at com.ibm.ws.tx.jta.TranManagerImpl.commit( TranManagerImpl.java:439)
at com.ibm.tx.jta.impl.TranManagerSet.commit(TranManagerSet.java:191)
at com.ibm.ws.uow.UOWManagerImpl.uowCommit(UOWManagerImpl。 Java的:807)美元,com.ibm.ws.uow.embeddable.EmbeddableUOWManagerImpl.uowEnd(EmbeddableUOWManagerImpl.java:881 b $ b)
在com.ibm.ws.uow.UOWManagerImpl.uowEnd(UOWManagerImpl.java: 782)
在com.ibm.ws.uow.embeddable.EmbeddableUOWManagerImpl.runUnderNewUOW(EmbeddableUOWManagerImpl.java:818)
在com.ibm.ws.uow.embeddable.EmbeddableUOWManagerImpl.runUnderUOW(EmbeddableUOWManagerImpl.java:在org.springframework.transaction.jta.WebSphereUowTransactionManager.execute 370)
(WebSphereUowTransactionManager.java:290)
。在org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:298)
在org.springframework.transaction .interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
在org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
在org.springframework.aop.interceptor.ExposeInvocationInterceptor .invoke(ExposeInvocationInterceptor.java:92)
在org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
在org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy .java:207)
at com.sun.proxy $ Proxy783.onMessage(Unknown Source)
at org.springframework.jms.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:685)
。在在org.springframework.jms.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:591)
org.springframework.jms.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:623)
。在组织。 springframewo在org.springframework.jms处使用
。AbstractBollingMessageListenerContainer.receiveAndExecute listener.DefaultMessageListenerContainer $ AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1142)维持在org.springframework.jms org.springframework.jms.listener.DefaultMessageListenerContainer $ AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1134)

。 listener.DefaultMessageListenerContainer $ AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:1031)
。在java.lang.Thread.run(Thread.java:790)

我发现类似于上述情况的报告问题,但没有人回复或提供解决方案 https://hibernate.atlassian.net/browse/HHH-10388



我想记录原因异常,指示问题是什么,在这种情况下是违反例外。

我试图将Spring和Hibernate的日志级别从ERROR更改为DEBUG,但仍然没有记录有用的信息。我已经通过更改应用程序和WAS中的日志设置来完成这项工作。



感谢您的任何想法。

解决方案

问题不在于吞噬异常,因为即使您有权访问它,您仍然会遇到JTA图层错误。 b

来自Hibernate WebSphereExtendedJtaPlatform class javadoc:


JTA平台实现,旨在与WebSphere
应用服务器(WAS)一起使用。与
星球上的其他应用程序服务器不同,它不允许直接访问JTS TransactionManager。
相反,对于常见的交易相关任务,用户必须使用称为ExtendedJTATransaction的
专有API。甚至更多
不幸的是,在WAS
中使用的确切的TransactionManagerLookup高度依赖于


  • WAS版本 li>
  • Hibernate将被使用的WAS容器



这个类被报告在WAS版本上工作6在任何标准的
J2EE / JEE组件容器中。

您正在使用WAS 8,所以 UnsupportedOperationException 是正确的。


Scenario: Spring 4.1.5.RELEASE; Hibernate 4.2.1.Final; WAS 8.5.5.5

When a database operation causes a violation exception (e.g.: value too long for a column), an UnsupportedOperationException is being thrown during the commit:

WTRN0074E: Exception caught from before_completion synchronization operation: java.lang.UnsupportedOperationException
at org.hibernate.service.jta.platform.internal.WebSphereExtendedJtaPlatform$TransactionManagerAdapter.setRollbackOnly(WebSphereExtendedJtaPlatform.java:139)
at org.hibernate.engine.transaction.internal.jta.CMTTransaction.markRollbackOnly(CMTTransaction.java:131)
at org.hibernate.engine.transaction.internal.TransactionCoordinatorImpl.setRollbackOnly(TransactionCoordinatorImpl.java:306)
at org.hibernate.engine.transaction.synchronization.internal.SynchronizationCallbackCoordinatorImpl.setRollbackOnly(SynchronizationCallbackCoordinatorImpl.java:126)
at org.hibernate.engine.transaction.synchronization.internal.SynchronizationCallbackCoordinatorImpl.beforeCompletion(SynchronizationCallbackCoordinatorImpl.java:116)
at org.hibernate.engine.transaction.synchronization.internal.RegisteredSynchronization.beforeCompletion(RegisteredSynchronization.java:53)
at org.hibernate.service.jta.platform.internal.WebSphereExtendedJtaPlatform$TransactionManagerAdapter$TransactionAdapter$1.invoke(WebSphereExtendedJtaPlatform.java:176)
at com.sun.proxy.$Proxy872.beforeCompletion(Unknown Source)
at com.ibm.ws.jtaextensions.SynchronizationCallbackWrapper.beforeCompletion(SynchronizationCallbackWrapper.java:66)
at com.ibm.tx.jta.impl.RegisteredSyncs.coreDistributeBefore(RegisteredSyncs.java:291)
at com.ibm.ws.tx.jta.RegisteredSyncs.distributeBefore(RegisteredSyncs.java:153)
at com.ibm.ws.tx.jta.TransactionImpl.prePrepare(TransactionImpl.java:2384)
at com.ibm.ws.tx.jta.TransactionImpl.stage1CommitProcessing(TransactionImpl.java:588)
at com.ibm.tx.jta.impl.TransactionImpl.processCommit(TransactionImpl.java:1029)
at com.ibm.tx.jta.impl.TransactionImpl.commit(TransactionImpl.java:963)
at com.ibm.ws.tx.jta.TranManagerImpl.commit(TranManagerImpl.java:439)
at com.ibm.tx.jta.impl.TranManagerSet.commit(TranManagerSet.java:191)
at com.ibm.ws.uow.UOWManagerImpl.uowCommit(UOWManagerImpl.java:807)
at com.ibm.ws.uow.embeddable.EmbeddableUOWManagerImpl.uowEnd(EmbeddableUOWManagerImpl.java:881)
at com.ibm.ws.uow.UOWManagerImpl.uowEnd(UOWManagerImpl.java:782)
at com.ibm.ws.uow.embeddable.EmbeddableUOWManagerImpl.runUnderNewUOW(EmbeddableUOWManagerImpl.java:818)
at com.ibm.ws.uow.embeddable.EmbeddableUOWManagerImpl.runUnderUOW(EmbeddableUOWManagerImpl.java:370)
at org.springframework.transaction.jta.WebSphereUowTransactionManager.execute(WebSphereUowTransactionManager.java:290)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:298)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
at com.sun.proxy.$Proxy783.onMessage(Unknown Source)
at org.springframework.jms.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:685)
at org.springframework.jms.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:623)
at org.springframework.jms.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:591)
at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:308)
at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:246)
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1142)
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1134)
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:1031)
at java.lang.Thread.run(Thread.java:790)

I've found a reported issue similar to the scenario above, but no one replied or presented a solution https://hibernate.atlassian.net/browse/HHH-10388

What I'd like is to log the cause exception, indicating what the problem is, which in this case is a violation exception.

I've tried to change the log levels of both Spring and Hibernate from ERROR to DEBUG, but still, no useful information is being logged. I've done that by changing the log settings in the application and in WAS too.

Any thoughts would be appreciated, thanks.

解决方案

The problem is not the swallowed exception, because even if you have access to it, you'l still get a JTA layer error.

From Hibernate WebSphereExtendedJtaPlatform class javadoc:

JTA platform implementation intended for use with WebSphere Application Server (WAS). WAS, unlike every other app server on the planet, does not allow direct access to the JTS TransactionManager. Instead, for common transaction-related tasks users must utilize a proprietary API known as ExtendedJTATransaction. Even more unfortunate, the exact TransactionManagerLookup to use inside of WAS is highly dependent upon

  • WAS version
  • the WAS container in which Hibernate will be utilized

This class is reported to work on WAS version 6 in any of the standard J2EE/JEE component containers.

You are using WAS 8, so maybe UnsupportedOperationException is the correct one.

这篇关于在WAS + Spring + Hibernate事务回滚之后被异常吞噬的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆