0

Spring と Hibernate Envers を使用して、レコードを監査テーブルに挿入しています。Wicket アプリケーション (Web) がサービスを呼び出すと、Spring が OpenSessionViewFiler を使用し、flushmode を Manual に設定することがわかります。AuditProcess クラスの doBeforeTransactionCompletion メソッドの次のコード:

  if (FlushMode.isManualFlushMode(session.getFlushMode())) {

IsManual が true になると、一時セッションを使用してレコードを監査テーブルに挿入します。正常に動作しています。

WebSphere には別のアプリケーション EJB、Spring、Hibernate があります。EJB から同じサービスを呼び出すと、flushmode が AUTO になり、上記のメソッドの AuditProcess クラスで次のエラーで失敗します。

"WTRN0074E: before_completion 同期から例外がキャッチされました
操作: org.hibernate.SessionException: セッションが閉じられました!"

この問題を解決するためのアイデアを教えてください:

[4/23/11 17:42:53:582 CDT] 00000023 RegisteredSyn E WTRN0074E: 例外
before_completion 同期操作からキャッチ:
org.hibernate.SessionException: セッションが閉じられました!
  org.hibernate.impl.AbstractSessionImpl.errorIfClosed (AbstractSessionImpl.java:72) で
  org.hibernate.impl.SessionImpl.contains (SessionImpl.java:1739) で
  org.hibernate.envers.synchronization.AuditProcess.getCurrentRevisionData(AuditProcess.java:125) で
  org.hibernate.envers.synchronization.AuditProcess.executeInSession (AuditProcess.java:104) で
  org.hibernate.envers.synchronization.AuditProcess.doBeforeTransactionCompletion (AuditProcess.java:152) で
  org.hibernate.engine.ActionQueue$BeforeTransactionCompletionProcessQueue.beforeTransactionCompletion (ActionQueue.java:543) で
  org.hibernate.engine.ActionQueue.beforeTransactionCompletion (ActionQueue.java:216) で
  org.hibernate.impl.SessionImpl.beforeTransactionCompletion (SessionImpl.java:571) で
  org.hibernate.jdbc.JDBCContext.beforeTransactionCompletion (JDBCContext.java:250) で
  org.hibernate.transaction.synchronization.CallbackCoordinator.beforeCompletion (CallbackCoordinator.java:125) で
  org.hibernate.transaction.synchronization.HibernateSynchronizationImpl.beforeCompletion (HibernateSynchronizationImpl.java:51) で
  org.hibernate.transaction.WebSphereExtendedJTATransactionLookup$TransactionManagerAdapter$TransactionAdapter$1.invoke(WebSphereExtendedJTATransactionLookup.java:209) で
  $Proxy44.beforeCompletion (不明なソース) で
  com.ibm.ws.jtaextensions.SynchronizationCallbackWrapper.beforeCompletion(SynchronizationCallbackWrapper.java:65) で
  com.ibm.ws.Transaction.JTA.RegisteredSyncs.distributeBefore(RegisteredSyncs.java:242) で
  com.ibm.ws.Transaction.JTA.TransactionImpl.prePrepare(TransactionImpl.java:2408) で
  com.ibm.ws.Transaction.JTA.TransactionImpl.stage1CommitProcessing (TransactionImpl.java:1641) で
  com.ibm.ws.Transaction.JTA.TransactionImpl.processCommit (TransactionImpl.java:1612) で
  com.ibm.ws.Transaction.JTA.TransactionImpl.commit(TransactionImpl.java:1547)
  com.ibm.ws.Transaction.JTA.TranManagerImpl.commit(TranManagerImpl.java:247)
  com.ibm.ws.Transaction.JTA.TranManagerSet.commit(TranManagerSet.java:167)
  com.ibm.ws.uow.UOWManagerImpl.uowCommit (UOWManagerImpl.java:1055) で
  com.ibm.ws.uow.UOWManagerImpl.uowEnd(UOWManagerImpl.java:1025)
  com.ibm.ws.uow.UOWManagerImpl.runUnderNewUOW(UOWManagerImpl.java:975)
  com.ibm.ws.uow.UOWManagerImpl.runUnderUOW(UOWManagerImpl.java:509)
  org.springframework.transaction.jta.WebSphereUowTransactionManager.execute (WebSphereUowTransactionManager.java:281) で
  org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:127) で
  org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) で
  org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202) で
  $Proxy66.getAocBufferData (不明なソース) で
  com.cvscaremark.links.submitorder.SubmitOrderFacade.executeSubmitOrderServices (SubmitOrderFacade.java:59) で
  com.cvscaremark.links.submitorder.SubmitOrderBean.processSubmitOrder(SubmitOrderBean.java:129) で
  com.cvscaremark.links.submitorder.SubmitOrderBean.ejbTimeout (SubmitOrderBean.java:102) で
  com.ibm.ejs.container.TimedObjectWrapper.ejbTimeout(TimedObjectWrapper.java:90) で
  com.ibm.ejs.container.TimerTaskHandler.doWork(TimerTaskHandler.java:265) で
  com.ibm.ws.scheduler.AlarmListener.executeTaskWithNotification(AlarmListener.java:795) で
  com.ibm.ws.scheduler.AlarmListener.access$700(AlarmListener.java:120) で
  com.ibm.ws.scheduler.AlarmListener$TaskWork.doWork(AlarmListener.java:426) で
  com.ibm.ws.scheduler.AlarmListener$TaskWork.run(AlarmListener.java:212) で
  com.ibm.ws.asynchbeans.J2EEContext.run(J2EEContext.java:782) で
  com.ibm.ws.asynchbeans.ExecutionContextImpl.go(ExecutionContextImpl.java:85) で
  com.ibm.ws.scheduler.AlarmListener.fireTask(AlarmListener.java:1400) で
  com.ibm.ws.scheduler.AlarmListener.fired (AlarmListener.java:1318) で
  com.ibm.ws.asynchbeans.AlarmImpl.callListenerMethod (AlarmImpl.java:338) で
  com.ibm.ws.asynchbeans.timer.GenericTimer.run(GenericTimer.java:216) で
  com.ibm.ws.asynchbeans.J2EEContext.run(J2EEContext.java:1150) で
  com.ibm.ws.asynchbeans.AlarmImpl.runListenerAsCJWork(AlarmImpl.java:173) で
  com.ibm.ws.asynchbeans.am._Alarm.fireAlarm(_Alarm.java:332) で
  com.ibm.ws.asynchbeans.am._Alarm.run(_Alarm.java:229) で
  com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1497) で

助けてくれてありがとう、ベンカット

4

1 に答える 1

0

セッションの作成に関する詳細については触れていません。

を使用して作成されgetCurrentSession()たセッションは、現在実行中のスレッドにバインドされ、フラッシュされ、自動的に閉じられるセッションを返します。使用する場合openSession()は、フラッシュとコミットなどを手動で確認する必要があります。

次の構成のいずれかを試すことができます。

  • hibernate.cfg.xml で、プロパティcurrent_session_context_classをに変更しますmanaged
  • フラッシュ モードを明示的に として設定できますsession.setFlushMode(FlushMode.MANUAL)
于 2011-05-03T18:07:46.727 に答える