#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)
.