Spring 中Hibernate session 打开和关闭总结

发布时间:2016-12-8 13:59:47 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"Spring 中Hibernate session 打开和关闭总结",主要涉及到Spring 中Hibernate session 打开和关闭总结方面的内容,对于Spring 中Hibernate session 打开和关闭总结感兴趣的同学可以参考一下。

session的断开是在org.springframework.orm.hibernate.SessionFactoryUtils中处理的。  如果应用程序使用了OpenSessionInViewFilter或者OpenSessionInViewInterceptor,那么所有的打开过的session会注册在ThreadLocal里。在当前线程退出前,OpenSessionInViewFilter或者OpenSessionInViewInterceptor将会负责断开这些session。 《1》 如果应用程序没有应用OpenSessionInViewFilter或者OpenSessionInViewInterceptor,那么只要该session没有Transaction就直接关闭。否则在transaction结束后关闭。 《2》 直接使用的是getHibernateTemplate().  得到session就不需要你来管理,spring会帮助你关闭的,无论你用的那种模式 《3》 如果你直接使用 Session session = this.getSession(); Query q =session。creatQuery。。。 这个时候就需要你自己来管理session的关闭问题了 可以是在dao中通过  finally {  this.closeSessionIfNecessary(session);  } 或者使用  sessionFactoryUtil中的方法关闭session 由于this.closeSessionIfNecessary(session); 现在是不推荐使用的方法,所以可以使用 DAO中调用this.releaseSession(session);  ----------------------------------------------------- Spring+Hibernate如何管理Session 关闭Session 在使用Spring进行系统开发的时候,数据库连接一般都是配置在Spring的配置文件中,并且由Spring来管理的。在利用Spring + Hibernate进行开发时也是如此。下面是一个简单的Spring + Hibernate Dao的例子: 程序代码: public class DaoReal extends HibernateDaoSupport implements Dao {   public List<User> getAll() {     return super.getHibernateTemplate().find("from User");   } }   在上面的这个例子中,我们并没有关闭Session,但程序并没有任何问题,那是因为Spring已经帮我们关闭了。那么再看一个例子: 程序代码: 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后,应该就没有问题了吧!是这样吗?修改我们的例子,如下: 程序代码: 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进行关闭。   要解决这个问题,方法有很多。可以使用我们之前讲到过的getHibernateTemplate().find()。也可以设定HibernateTemplate的AllowCreate为True,并在finally中关闭Session。也可以将true作为参数传递到super.getSession(..)方法中取得Session。这里的true表示允许创建。

上一篇:ASP.NET完整打包卸载更新攻略(By Installshield 2010)(转载)
下一篇:C和指针 学习笔记—第3章

相关文章

相关评论