【问题标题】:Exception : org.hibernate.SessionException: Session was already closed异常:org.hibernate.SessionException:会话已经关闭
【发布时间】:2014-07-03 04:15:38
【问题描述】:

我正在使用 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
    }

}

提前致谢。

【问题讨论】:

  • 你能提供代码 sn -p 是在哪里抛出这个异常吗?
  • 你在事务内部做休眠操作吗?如果不做事务内部会话的所有操作,hibernate.transaction.auto_close_session会在事务之后关闭会话。
  • 你能不能只显示一些你在做什么的代码。 ?
  • 在 ServiceImpl 包中:我使用了 @Transactional 并从中调用了 DAOImpl 包。并执行所有事务操作。那我是怎么解决的呢?
  • @Krishna 我添加了我的代码的一些基本结构。

标签: java spring hibernate


【解决方案1】:
  1. 尝试手动关闭连接。和
  2. 使用 .openSession();打开会话的方法而不是 .getCurrentSession();也不例外。

【讨论】:

    【解决方案2】:

    问题是你不能在Session 上调用两次close(),第二次调用close() 方法时,它会抛出那个异常。

    通过设置auto_close,您会在使用后隐式关闭会话,因此解决方案是删除代码中的close() 方法,或者只是删除auto_close 配置并在使用后手动关闭会话.

    【讨论】:

    • 我没有在我的代码中使用 close() 方法。我正在使用 sessionFectory 的@Autowired 概念,因此无需关闭它。我正在使用 sessionFactory.getCurrentSession()。
    • 啊,那么问题是 getCurrentSession 会为您提供上一个因此而自动关闭的会话,因此尝试再次使用它(即使它已关闭)也会为您提供。但是这一切都是猜测,因为我们没有看到任何可以分析的代码。
    • @KevalTrivedi 简单的事情是再次打开该会话;)
    • 我想隐式关闭连接。因为当我从数据库中获取大量数据时需要很长时间。如果我在交易后隐式关闭连接。它给了我快速的响应。
    【解决方案3】:

    如果此标志设置为 true,则会话将在事务完成后阶段自动关闭。同意 Edward 关于您试图隐式关闭抛出该异常的连接的方法。

    【讨论】:

    • 我想隐式关闭连接。因为当我从数据库中获取大量数据时需要很长时间。如果我在交易后隐式关闭连接。它给了我快速的响应。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-24
    • 1970-01-01
    • 2013-04-09
    • 2011-10-01
    • 1970-01-01
    • 2010-11-29
    相关资源
    最近更新 更多