`

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);

}
} 
分享到:
评论

相关推荐

    spring整合hibernate示例代码

    标题"spring整合hibernate示例代码"提示我们,我们将讨论如何在实际项目中结合这两个框架。Spring可以帮助管理Hibernate的SessionFactory和Transaction,提供声明式事务管理,以及通过AOP(面向切面编程)实现更灵活...

    Spring+hibernate整合源代码

    1. **依赖注入**:Spring 提供的 DI(Dependency Injection)机制可以帮助管理 Hibernate SessionFactory 和 Session 实例,避免手动创建和管理这些对象。在配置文件中定义 SessionFactory 的 Bean,然后通过注解或 ...

    Spring整合Hibernate.jar

    标题"Spring整合Hibernate.jar"意味着我们将讨论如何将这两个强大的框架集成在一起,以便在Spring管理的环境中使用Hibernate进行数据库操作。这通常涉及到以下步骤和知识点: 1. **引入依赖**:首先,你需要在项目...

    spring整合hibernate所用相关jar包

    本文将深入探讨Spring整合Hibernate的相关知识点,适合初学者入门。 首先,我们需要理解Spring的核心理念。Spring框架提供了一个轻量级的容器,它能够管理应用程序中的对象,包括初始化、配置和依赖注入。AOP则是...

    Spring整合Hibernate案例

    - 整合Spring和Hibernate的主要目的是利用Spring的管理能力,让Hibernate的DAO(数据访问对象)和SessionFactory可以通过Spring的IoC(控制反转)容器进行管理和注入,提高代码的可测试性和可维护性。 3. **整合...

    Spring3整合Hibernate4测试Demo

    在"Spring3整合Hibernate4测试Demo"中,我们将探讨如何将Spring3作为服务层容器,管理Hibernate4的数据访问组件。这个Demo主要包含以下几个关键知识点: 1. **Spring的IoC(Inversion of Control,控制反转)**:...

    spring整合hibernate实例

    这篇名为"spring整合hibernate实例"的内容,显然是关于如何将这两个框架协同工作,构建一个高效、灵活的Java应用的教程。在整合过程中,我们将探讨以下几个关键知识点: 1. **Spring的ApplicationContext**: 这是...

    Spring整合HIbernate

    《Spring整合Hibernate实战指南》 在Java开发领域,Spring框架以其强大的依赖注入、AOP(面向切面编程)以及丰富的模块支持,成为了企业级应用开发的首选。而Hibernate作为持久层框架,以其对象关系映射(ORM)能力...

    spring与hibernate的整合

    总结来说,Spring 与 Hibernate 的整合主要涉及 SessionFactory 的配置、DAO 类的实现以及事务管理。通过 Spring 的 IoC 容器管理数据访问资源,可以使应用更加解耦,同时利用 Spring 的事务管理功能,可以简化事务...

    hibernate与spring整合demo

    将Hibernate与Spring整合可以充分利用两者的优点,提高开发效率并降低复杂性。 一、Hibernate概述 Hibernate是Java世界中领先的ORM框架之一,它允许开发者用Java对象来操作数据库记录,而无需编写SQL语句。通过配置...

    spring mvc + spring + hibernate 全注解整合开发视频教程 12

    在Spring和Hibernate的整合中,Spring可以作为Hibernate的容器,管理SessionFactory和Transaction,这样我们就能够在Spring的管理下进行数据库操作。通过@PersistenceContext注解,Spring可以注入EntityManager,@...

    spring_hibernate整合实例

    总之,Spring和Hibernate的整合使得开发者可以利用Spring的强大管理能力,同时享受Hibernate带来的便捷数据操作,从而提高开发效率和应用的可维护性。通过合理的配置和设计,我们可以构建出健壮且灵活的后端系统。

    Spring整合Hibernate 详解.doc

    Spring整合Hibernate是现代Java开发中常见的一种技术组合,利用Spring框架的强大功能来管理和协调Hibernate的持久化操作。Spring为Hibernate提供了全面的集成方案,简化了DAO(Data Access Object)的开发,同时也...

    spring整合hibernate开发源码

    在"spring整合hibernate开发源码"的压缩包中,可能包含了以下内容: 1. **配置文件**:如`applicationContext.xml`,其中配置了Spring和Hibernate的相关bean,如DataSource、SessionFactory、TransactionManager等。...

    Spring与hibernate 整合 简单示例

    总结来说,Spring与Hibernate的整合使得Java开发人员能够更方便地管理数据库操作,并利用Spring的强大功能进行事务管理和组件装配。通过这个简单的示例,我们可以了解到如何配置Spring的环境,定义实体类,创建DAO和...

    MyClipse6.0\Struts2,Spring与Hibernate整合应用,学生成绩管理系统

    《Struts2、Spring与Hibernate整合应用:学生成绩管理系统》 在IT行业中,构建一个高效、稳定的Web应用程序常常需要整合不同的框架。本项目“学生成绩管理系统”就是基于Struts2、Spring和Hibernate三大主流Java ...

    Struts+Spring+Hibernate整合练习

    Struts+Spring+Hibernate 整合是Java Web开发中常用的一种技术栈,它结合了三个强大的框架,分别负责表现层(Struts)、业务逻辑层(Spring)和持久化层(Hibernate)。这种组合提供了完整的MVC架构,使得开发过程...

    ZK+spring+hibernate的整合

    《ZK+Spring+Hibernate整合详解》 ZK、Spring和Hibernate是Java开发中的三大重要框架,它们分别在用户界面、依赖注入与事务管理、持久层操作方面发挥着关键作用。将这三者进行整合,可以构建出高效、稳定且易于维护...

    用maven整合struts+spring+hibernate

    "用maven整合struts+spring+hibernate"这个主题,就是关于如何将这三大核心框架——Struts、Spring和Hibernate——集成到一个项目中的实践教程。Struts提供了MVC(Model-View-Controller)架构,Spring是全面的后端...

    struts2 + spring 3 + hibernate3.3整合实现图书馆管理管理

    Struts2、Spring和Hibernate是Java Web开发中的三大框架,它们的整合应用广泛用于构建复杂的Web应用程序,如本例中的图书馆管理系统。这个系统实现了用户登录和注册功能,并且提供了对书籍表的操作,包括增、删、改...

Global site tag (gtag.js) - Google Analytics