`

spring整合hibernate关于session的管理

阅读更多

最近在测试oa系统的时候,发现若连接几次数据库后,tomcat就完全没反应,打开log文件,发现系统抛出java.lang.IllegalStateException: Pool not open的异常。在网上找到了问题及解决方法如下:

在使用Spring进行系统开发的时候,数据库连接一般都是配置在Spring的配置文件中,并且由Spring来管理的。在利用Spring + Hibernate进行开发时也是如此。下面是一个简单的Spring + Hibernate Dao的例子:


程序代码

Java代码 复制代码
  1. public class DaoReal extends HibernateDaoSupport implements Dao {   
  2.   public List<User> getAll() {   
  3.     return super.getHibernateTemplate().find("from User");   
  4.   }   
  5. }  
public class DaoReal extends HibernateDaoSupport implements Dao {
  public List<User> getAll() {
    return super.getHibernateTemplate().find("from User");
  }
}

 

 

  在上面的这个例子中,我们并没有关闭Session,但程序并没有任何问题,那是因为Spring已经帮我们关闭了。那么再看一个例子:


程序代码

Java代码 复制代码
  1. public class DaoReal extends HibernateDaoSupport implements Dao {   
  2.   public List<User> getAll() {   
  3.     return super.getSession().createQuery("from User").list();   
  4.   }   
  5. }  
public class DaoReal extends HibernateDaoSupport implements Dao {
  public List<User> getAll() {
    return super.getSession().createQuery("from User").list();
  }
}

 

 

  这个例子会不会有问题呢?的确,上面的例子中隐藏了一个问题,数据库连接并没有被关闭,在我们的印象中这件事似乎应该是Spring的。程序执行后,好像也没有什么问题,但是连续执行该语句n次(n<=最大连接数,如果没有指定最大连接数,那么默认为10次)后,系统处于等待状态,不会继续执行了,控制台上并没有输出任何信息。打开log文件,发现系统抛出java.lang.IllegalStateException: Pool not open的异常,无法打开连接。这说明系统连接池中所有的连接都在使用中。那么我们手动关闭Session后,应该就没有问题了吧!是这样吗?修改我们的例子,如下:


程序代码

Java代码 复制代码
  1. public class DaoReal extends HibernateDaoSupport implements Dao {   
  2.   public List<User> getAll() {   
  3.     Session s = super.getSession();   
  4.     try {   
  5.       return s.createQuery("from User").list();   
  6.     } finally {   
  7.       s.close();   
  8.     }   
  9.   }   
  10. }  
public class DaoReal extends HibernateDaoSupport implements Dao {
  public List<User> getAll() {
    Session s = super.getSession();
    try {
      return s.createQuery("from User").list();
    } finally {
      s.close();
    }
  }
}

 

 

  执行n遍后依然停止响应。问题出在哪里呢?其实Spring的Session总是与某个线程绑定的,而这个线程往往就是承载Servlet或Jsp的那个线程,也就是说,它的生命周期scope是request的。在上面的例子中,我们利用getSession强制获得了Hibernate的 Session,这个Session可能是当前事务中之前使用过的,或者可能是一个新的,并不在当前事务中,Spring只对当前事务中的Session 进行关闭。

这里有3个解决方案:
方案一:

用此种方法,虽然没有手动关闭数据库连接,但spring已经帮我们关闭了

Java代码 复制代码
  1. return super.getHibernateTemplate().find(hql);  
return super.getHibernateTemplate().find(hql);

 

 

方案二:(我用这方法解决的)

设定HibernateTemplate的AllowCreate为True,允许创建一个新的session

 

Java代码 复制代码
  1. public class ItemDAOImpl extends HibernateDaoSupport implements ItemDAO {   
  2.   
  3. public List queryAll() throws Exception {   
  4.   
  5.     Session session=super.getSession(true);   
  6.   
  7.     String hql="from Item as i";   
  8.   
  9.     try{   
  10.   
  11.    List l=session.createQuery(hql).list();   
  12.   
  13.     }finally{   
  14.   
  15.     session.close();   
  16.     }   
  17. }   
  18. }   
public class ItemDAOImpl extends HibernateDaoSupport implements ItemDAO {

public List queryAll() throws Exception {

    Session session=super.getSession(true);

    String hql="from Item as i";

    try{

   List l=session.createQuery(hql).list();

    }finally{

    session.close();
    }
}
} 

 

方案三:

Spring API:
geSession()是org.springframework.orm.hibernate3.support.HibernateDaoSupport 中的一个方法,
它可以从当前事务或者一个新的事务获得一个hibernate session.
通常使用releaseSession(org.hibernate.Session)方法与getSession()配合。
如果没有绑定线程,releaseSession关闭由这个DAO的SessionFactory创建的Hibernate Session。 
修改后的代码如下:

Java代码 复制代码
  1. public class ItemDAOImpl extends HibernateDaoSupport implements ItemDAO {   
  2.   
  3. public List queryAll() throws Exception {   
  4.   
  5.     Session session = super.getSession();   
  6.   
  7.     String hql = "from Item as i";   
  8.   
  9.     List l = session.createQuery(hql).list();   
  10.   
  11.     releaseSession(session);   
  12.   
  13. }   
  14. }   
public class ItemDAOImpl extends HibernateDaoSupport implements ItemDAO {

public List queryAll() throws Exception {

    Session session = super.getSession();

    String hql = "from Item as i";

    List l = session.createQuery(hql).list();

    releaseSession(session);

}
} 
分享到:
评论

相关推荐

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (1)

    12.6 整合Struts、Spring和Hibernate实现用户管理 12.6.1 Struts、Spring和Hibernate的整合方式 12.6.2 编写用户注册画面regedit.jsp 12.6.3 编写用户登录画面login.jsp 12.6.4 编写注册控制器RegeditAction.java ...

    第24次课-1 Spring与Hibernate的整合

    如果Spring与Hibernate进行了整合,则Hibernate便处于被Spring管理的状态下,Hibernate所需的基础资源,都由Spring以注入的方式提供。 由Spring接管的内容包括: Hibernate创建SessionFactory时需要的DataSource ...

    整合jsf hibernate spring实例

    部门人员一对多的CRUD操作 hibernate: 管理实体...spring:数据源配置与获得session IOC依赖注入 和 AOP 事务管理 jsf : backing bean的操作 jsf 标签应用 jsf 信息国际化以资源绑定 jsf 表单验证 jsf 导航设定

    Spring4.0+Hibernate4.0+Struts2.3整合案例

    Spring4.0+Hibernate4.0+Struts2.3整合案例:实现增删改查。 ===================== application.xml: xmlns="http://www.springframework.org/schema/beans" xmlns:xsi=...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (2)

    12.6 整合Struts、Spring和Hibernate实现用户管理 12.6.1 Struts、Spring和Hibernate的整合方式 12.6.2 编写用户注册画面regedit.jsp 12.6.3 编写用户登录画面login.jsp 12.6.4 编写注册控制器RegeditAction.java ...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (3)

    12.6 整合Struts、Spring和Hibernate实现用户管理 12.6.1 Struts、Spring和Hibernate的整合方式 12.6.2 编写用户注册画面regedit.jsp 12.6.3 编写用户登录画面login.jsp 12.6.4 编写注册控制器RegeditAction.java ...

    Spring-session2整合spring5+redis

    spring5+hibernate5+Spring-session-data-redis2+Spring-data-redis2整合

    SpringMVC+Hibernate+annotation+Easyui权限管理系统

    SpringMVC+Hibernate+annotation+Easyui权限管理系统,Session过期控制(包括Ajax请求的过期控制),访问权限控制(权限控制到按钮),hibernate数据库用户名与密码加密,其它的不说了,绝对物有所值

    ssh框架整合step by step (springMVC + spring 5.0.4 + hibernate 5.0.12)

    ③ 整合hibernate # 使用entity/dao/service全部使用注解扫描, 大大减少再开发的代码量; # 事务的织入: 开发时不必再处理SessionFactory、Session等, 只要按配置文件指定的格式对方法进行命名, 即可自动开启/提交...

    SSH整合 struts+hibernate+spring

    SSH整合概述 应用IoC进行整合 应用AOP进行整合 Open Session In View模式

    整合spring3-hibernate的小项目(一)

    【SSH学习笔记】整合spring3-hibernate的小项目(一) 配套资源 需求分析: 1、使用spring注入dataSourse数据源 2、使用BaseDao获取注入SessionFactory并返回Session 3、实现查询所有和按字符串查询的方法 4、...

    Struts Spring Hibernate 整合 OpenSessionInView 例子

    为了练手培训,给大家准备的 Open Session In View 的简单例子,纯代码,大家可以参考,其中主要说了六部分内容: 1.通过接口编程 2.通过spring注入dao到 action 3.通过 open session in view filter 支持 延迟加载...

    整合spring3-hibernate的小项目(二)

    【SSH学习笔记】整合spring3-hibernate的小项目(二) 配套资源 需求分析: 1、使用spring注入dataSourse数据源 2、使用BaseDao获取注入SessionFactory并返回Session 3、用generic接口及其实现类,实现泛型化的...

    SHH整合(mysql,struts2 2.2+spring2.5+hibernate3.0,log,jquery,标签等)DEMO

    1、SHH整合 详细清晰的标准配置,主流的应用配置,struts2.2+spring2.5+hibernate3.0 2、结合MYSQL轻量级数据库,有写好的库表sql 3、整合日志管理配置,及Spring代理日志管理的配置及应用 4、应用WEB前段主流技术,...

    Spring的学习笔记

    三、 Spring整合hibernate3事务 31 (一) Annotation注解方式配置事务管理 31 (二) Spring事务选项 35 (三) XML文件形式配置Spring事务管理 37 四、 HibernateTemplate 38 (一) HibernateTemplate 38 (二) ...

    struts2.3.x+spring3.1.x+hibernate3.6 demo

    十分抱歉,上次整合的是一个半成品,spring3.1和hibernate4.1目前为止我测试了,整合过程中有很多问题!关键问题有几个,第一个HibernateDaoSupport这个没有了,在使用hibernateTemplate的时候,报错误:java.lang....

    spring2.5 学习笔记

    三、 Spring整合hibernate3事务 31 (一) Annotation注解方式配置事务管理 31 (二) Spring事务选项 35 (三) XML文件形式配置Spring事务管理 37 四、 HibernateTemplate 38 (一) HibernateTemplate 38 (二) ...

    SpringAll_wuyouzhuguli.tar.gz

    Spring Security Session管理 Spring Security退出登录 Spring Security权限控制 Spring Security OAuth2入门 Spring Security OAuth2自定义Token获取方式 Spring Security OAuth2自定义令牌配置 Spring Security ...

    SSH整合中 hibernate托管给Spring得到SessionFactory

    Spring文件中的 SessionFactory中 加入为了能得到同一个Session

Global site tag (gtag.js) - Google Analytics