Исключение: org.hibernate.Исключение SessionException: сессия уже была закрыта

#java #spring #hibernate

#java #весна #переход в спящий режим

Вопрос:

Я разрабатываю приложение, используя java spring hibernate oracle. когда я добавляю приведенное ниже свойство в свой dispatcher-servlet.xml файл.

 <prop key="hibernate.transaction.auto_close_session">true</prop>
  

Он выдает исключение, как показано ниже :

 org.hibernate.SessionException: Session was already closed
at org.hibernate.impl.SessionImpl.close(SessionImpl.java:302)
at org.springframework.orm.hibernate3.SessionFactoryUtils.closeSession(SessionFactoryUtils.java:791)
at org.springframework.orm.hibernate3.SessionFactoryUtils.closeSessionOrRegisterDeferredClose(SessionFactoryUtils.java:777)
at org.springframework.orm.hibernate3.HibernateTransactionManager.doCleanupAfterCompletion(HibernateTransactionManager.java:737)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.cleanupAfterCompletion(AbstractPlatformTransactionManager.java:1011)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:804)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723)
at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:393)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:120)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
at $Proxy354.getMenu4Priv(Unknown Source)
at com.itzcash.easy.reports.controller.SalesDistributionReportController.searchCustomerProfile(SalesDistributionReportController.java:261)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176)
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:426)
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:414)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:790)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:560)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at net.bull.javamelody.MonitoringFilter.doFilter(MonitoringFilter.java:208)
at net.bull.javamelody.MonitoringFilter.doFilter(MonitoringFilter.java:181)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:235)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:190)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:433)
at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:92)
at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.process(SecurityContextEstablishmentValve.java:126)
at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.invoke(SecurityContextEstablishmentValve.java:70)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:158)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:330)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:829)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:598)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Unknown Source)
  

если я удалю это свойство, исключения не возникнет.

Мой код выглядит следующим образом :

   @Service
    Class ABCServiceImpl 
{
    @Transactional
    void methodA()
    {
       // called the method in DAOImpl package -- methodB().
    }

}

@Repository
Class ABCDAOImpl
{
    @Autowired
    SessionFectory s;

    void methodB()
    {
      // hibernate operatoion
    }

}
  

Заранее спасибо.

Комментарии:

1. можете ли вы предоставить фрагмент кода, где is выдает это исключение.

2. Выполняете ли вы операции гибернации внутри транзакции? Если не выполнить все операции над сессией в рамках транзакции, as hibernate.transaction.auto_close_session закроет сессию после транзакции.

3. Можете ли вы просто показать немного кода, что вы делаете. ?

4. В пакете ServiceImpl: я использую @Transactional и из этого я вызвал пакет DaoImpl. и выполнил все транзакционные операции. тогда как я решил эту проблему ?

5. @Krishna Я добавил некоторую базовую структуру своего кода.

Ответ №1:

  1. Попробуйте закрыть соединение вручную. и
  2. используйте .OpenSession(); метод для открытия сессии вместо .getCurrentSession(); исключения не возникает.

Ответ №2:

Проблема в том, что вы не можете вызвать close() дважды на Session , во второй раз, когда вы вызываете close() метод, он выдаст это исключение.

Устанавливая auto_close , вы неявно закрываете сеанс после его использования, поэтому решением было бы удалить close() методы в вашем коде или просто удалить эту auto_close конфигурацию и закрыть сеансы вручную после их использования.

Комментарии:

1. я не использую метод close () в своем коде. я использую концепцию @Autowired для sessionFectory, поэтому нет необходимости закрывать ее. я использую SessionFactory.getCurrentSession().

2. ах, тогда проблема в том, что getCurrentSession возвращает вам предыдущий сеанс, который был закрыт автоматически из-за этого, поэтому попытка использовать его снова (даже если он закрыт) дает вам это тоже. Но все это в значительной степени предположение, поскольку мы не видим никакого кода, который мы могли бы проанализировать.

3. @KevalTrivedi простая вещь — снова открыть эту сессию 😉

4. Я хочу закрыть соединение неявно. из-за того, что при извлечении большого объема данных из базы данных это занимает много времени. если я неявно закрою соединение после транзакции. это дает мне быстрый ответ.

Ответ №3:

Если для этого флага установлено значение true, то сессия будет автоматически закрыта на этапе после завершения транзакции. Согласен с Эдвардом в том, что вы пытаетесь неявно закрыть соединение, вызывающее это исключение.

Комментарии:

1. Я хочу закрыть соединение неявно. из-за того, что при извлечении большого объема данных из базы данных это занимает много времени. если я неявно закрою соединение после транзакции. это дает мне быстрый ответ.