releaseSession理解

转载 2013年12月03日 19:48:50
Hibernate可以实现分页查询,昨天试了一下,分页效果不错。但是发现了一个问题,就是当请求超过20次的时候页面就会卡死。经检查,是卡在分页查询这一块。

应用程序采用struts2 + spring2 + hibernate3架构 
连接池配置使用的是c3p0, 最大池大小为20, 很显然是连接池耗尽导致的。 增加连接池大小只是饮鸩止渴,总还有耗尽的时候,必须找到根本原因。


Dao类的分页查询方法如下:
    public List getTopics(int perPageStartNum, int perPageShowNum, long f_id) {  
        Query query = getSession().createQuery("from Topic where forumId=" + f_id);  
        query.setFirstResult(perPageStartNum);  
        query.setMaxResults(perPageShowNum);  
        return query.list();  
    }  

我尝试在获得list之后,使用getSession().close()关闭,没有效果。

早上来上班继续调试,问题依旧。仔细想想可能还是对于spring中集成的操作hibernate session 的方法不熟悉。
查阅Spring API:
geSession()是org.springframework.orm.hibernate3.support.HibernateDaoSupport 中的一个方法,
它可以从当前事务或者一个新的事务获得一个hibernate session. 
通常使用releaseSession(org.hibernate.Session)方法与getSession()配合。
如果没有绑定线程,releaseSession关闭由这个DAO的SessionFactory创建的Hibernate Session。 

修改后的代码为:
    public List getTopics(int perPageStartNum, int perPageShowNum, long f_id) {  
        Session session = getSession();  
      
        List list = session.createQuery("from Topic where forumId=" + f_id)  
               .setFirstResult(perPageStartNum)  
               .setMaxResults(perPageShowNum)  
               .list();  
      
        releaseSession(session);  
      
        return list;  
    }  

启动服务器测试,问题解决。

另外,可参考:http://sunxboy.iteye.com/blog/385534    spring整合hibernate关于session的管理
                            http://blog.csdn.net/bluishglc/article/details/6261905    Spring中使用getSession()与通过HibernateTemplate进行数据操作的差别
                            结论:HibernateDaoSupport的getSession()得到的Session会参与Spring管理的事务中,但是不能自动的关闭.HibernateTemplate除能参与到Spring管理的事务中,还能够确保Session实例的正确打开和关闭.
                              
     




一个由session.close()引发的血案

一个由session.close()引发的血案
  • java_magicsun
  • java_magicsun
  • 2017年03月03日 11:13
  • 1329

个人对mybatis框架的理解与体会

年末了,停下来歇歇,顺便把自己对mybatis的理解来说一说。     本次开发用的是spring mvc 3.0+mybatis, spring mvc就不多说了,接下来,重点说一下mybatis...
  • qq_25667339
  • qq_25667339
  • 2015年02月12日 15:32
  • 4646

spring中注解的实现原理,帮助理解@autowired @resource区别

@Autowired和@Resource的区别:   在Java中使用@Autowired和@Resource注解进行装配,这两个注解分别是: 1、@Autowired按照默认类型(类名称)装配依赖对...
  • xspwz123
  • xspwz123
  • 2015年10月14日 15:51
  • 2241

理解PHP原理之必备

  • 2018年01月12日 17:09
  • 19.88MB
  • 下载

64QAM的matlab调试仿真程序(新手自己的理解编写,内含详细注释,希望大家提意见)

  • 2018年01月16日 17:32
  • 3KB
  • 下载

深入理解Spark 核心思想与源码分析 完整版 pdf

  • 2018年01月12日 11:14
  • 40.77MB
  • 下载

深入理解视频编解码技术 基于H.264标准及参考模型

  • 2018年01月12日 10:45
  • 28.24MB
  • 下载

深入理解Java虚拟机 JVM高级特性与最佳实践 第2版 pdf

  • 2018年01月13日 00:21
  • 59.36MB
  • 下载

深入理解PHP数组原理,高级用法

  • 2018年01月13日 09:23
  • 49B
  • 下载

深入理解Android卷1

  • 2018年01月15日 21:38
  • 35.63MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:releaseSession理解
举报原因:
原因补充:

(最多只允许输入30个字)