Исключение, полученное из операции синхронизации before_completion: org.hibernate.Исключение SessionException: сессия закрыта!

#spring #ejb #websphere-6.1 #hibernate-envers

#spring #ejb #websphere-6.1 #переход в спящий режим-envers

Вопрос:

Я использую Spring с преобразователями Hibernate для вставки записи в таблицы аудита. Когда приложение Wicket (веб) вызывает службу, я вижу, что Spring использует OpenSessionViewFiler и устанавливает режим flushmode в ручное управление. Класс AuditProcess следующий код в методе doBeforeTransactionCompletion:

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

IsManual становится true, затем он использует временный сеанс для вставки записи в таблицы аудита. Все работает нормально.

У нас есть другое приложение EJB, Spring, в режиме гибернации в WebSphere. Когда мы вызываем ту же службу из EJB, flushmode становится автоматическим, и в классе AuditProcess в вышеупомянутом методе происходит сбой с ошибкой:

"WTRN0074E: исключение, полученное из синхронизации before_completion 
операция: org.hibernate.Исключение SessionException: сессия закрыта!"

Пожалуйста, дайте мне знать ваши идеи по решению этой проблемы:

[23.04.11 17:42:53:582 CDT] 00000023 RegisteredSyn E WTRN0074E: Исключение 
получено из операции синхронизации before_completion: 
org.hibernate.Исключение SessionException: сессия закрыта!
 в org.hibernate.impl.AbstractSessionImpl.Ошибка, если закрыто (AbstractSessionImpl.java:72) 
 в org.hibernate.impl.SessionImpl.contains(SessionImpl.java:1739)
 при org.hibernate.envers.синхронизации.AuditProcess.getCurrentRevisionData(AuditProcess.java:125)
 при org.hibernate.envers.синхронизации.AuditProcess.executeInSession(AuditProcess.java:104) 
 при org.hibernate.envers.синхронизации.Процесс проверки.doBeforeTransactionCompletion(AuditProcess.java:152)
 в org.hibernate.engine.ActionQueue$BeforeTransactionCompletionProcessQueue.beforeTransactionCompletion(ActionQueue.java:543)
 в org.hibernate.engine.Очередь действий.beforeTransactionCompletion(ActionQueue.java:216)
 при org.hibernate.impl.SessionImpl.beforeTransactionCompletion(SessionImpl.java:571)
 в org.hibernate.jdbc.JDBCContext.beforeTransactionCompletion(JDBCContext.java:250)
 в org.hibernate.transaction.синхронизация.CallbackCoordinator.beforeCompletion(CallbackCoordinator.java:125)
 в org.hibernate.transaction.синхронизация.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.продолжить (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)

Спасибо за вашу помощь, Venkat

Ответ №1:

Не упомянул подробности о создании сеанса.

Сессия, созданная с помощью getCurrentSession() , вернет сессию, которая привязана к текущему потоку и автоматически сбрасывается и закрывается. Если openSession() используется, то придется искать вручную после сброса и фиксации и т.д.

Вы можете попробовать использовать одну из следующих конфигураций.

  • В вашем hibernate.cfg.xml , измените свойство current_session_context_class на managed .
  • Можно явно установить режим сброса как session.setFlushMode(FlushMode.MANUAL) .