现在的位置: 首页 > 综合 > 正文

Spring和Hibernate的Session管理机制

2017年12月27日 ⁄ 综合 ⁄ 共 2768字 ⁄ 字号 评论关闭

--->spring有没有管理到session,事务有没有管理到session
--->用不用自己关闭session
--->用不用自己关闭connection


---Test by myself:

	/**
	 * getSession:
	 * 该方式获取的Session,如果没有加事务,且没有手动调用releaseSession(),则spring确实不会自动关闭Session(可查看log日志会发现没有Closing Hibernate Session)。
	 * 如果没有加事务,但有手动调用releaseSession,那最后是手动关闭了Session。
	 * 如果加了事务,无论有没有手动调用releaseSession,spring都会自动关闭session。
	 */
	 
	/**
	 * getCurrentSession:
	 * 该方式获取的Session,必须包含在Spring的事务管理中,不然会报错No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here。
	 * 在被spring事务管理后,无论有没有手动调用releaseSession,spring最后都会关闭Session。
	 */


链接:http://www.iteye.com/topic/733971【重要】
1.通过getSession()方法获得session进行操作
利用getSession().save()这种方式获得的session在方法执行结束之后不会自动关闭连接,也就是说我们必须通过releaseSession(session)来手动进行关闭,否则会造成内存泄露或者连接耗尽等问题。
[如果对上述方法进行事务控制,那么spring框架会自动为我们关闭session,]
getSession(true):从一个新的事务中获得session
getSession(false):从当前事务中获取session,所以必须对当前方法进行事务控制,否则会抛出异常
2.getCurrentSession()与openSession() 
①getCurrentSession创建的session会和绑定到当前线程,而openSession不会。   
②getCurrentSession创建的线程会在事务回滚或事物提交后自动关闭,而openSession必须手动关闭  
openSession()方法,spring无法对其进行控制,所以事务也不会起作用。
3.OpenSessionInView 
OpenSessionInView的主要功能是用来把一个Hibernate Session和一次完整的请求过程对应的线程相绑定。
4. 总结:
(1) 对于getSession(),getSession(false),getCurrentSession()以及getHibernateTemplate()方法而言,如果对其所在方法进行事务控制,那么Spring可以确保在整个方法中只存在一个session,无论你执行了几次CRUD操作,并且所打开的session会在事务结束时自动关闭。 
(2) 必须对getSession(false)以及getCurrentSession()所在的方法进行事务控制(原因见上述分析) 
(3) 如果没有对getSession()以及getHibernateTemplate()所在方法进行事务控制,那么如果在方法中进行N次CRUD操作,就会打开N个session,即每次调用getSession()和getHibernateTemplate()方法都会打开新的session。这两个方法的区别在于:getHibernateTemplate()方法结束时会自动关闭连接,而getSession()方法必须手动关闭。 
(4) 如果在方法中采用SessionFactory的openSession()方法获得连接进行操作,那么无法对其进行事务控制。 
(5) 一般的开发中,通常采用getHibernateTemplate()方法进行数据库操作, getHibernateTemplate()方法采用模板+回调的机制,进行数据库操作很方便,可以查看(其中session的打开与关闭都是在doExecute方法中进行的): 


链接:http://blog.csdn.net/zmhinzaghi/article/details/7091629
--this.getsession实际上是调用了父类HibernateDaoSupport中的方法获得session。使用spring管理hibernate的SessionFactory的时候,这个方法会从session池中拿出一session。这样做有可能有问题,尽管这种方式拿到的Session会自动关闭,但是他是有一定的失效策略的,而且在超session池连接数的时候,spring无法自动的关闭这些session。  不推荐使用
--this.getHibernateTemplate().getSessionFactory().getCurrentSession()从spring管理的sessionFactory中创建一个绑定线程的session。Spring会根据该线程的执行情况来自动判断是关闭session还是延迟关闭。这样做可以避免手动的管理实务,同时一个线程最多开启和关闭一次session又可以提高程序的性能。 极力推荐使用这种方法 
--this.getHibernateTemplate().getSessionFactory().OpenSession。这种方法从spring管理的sessionFactory中创建一个session,此session不是线程绑定的。当执行完一个实务的时候自动关闭session。这种方法不用手动管理实务,但是同一个线程多次的开启和关闭session,浪费系统资源和影响执行效率,正常情况下还是不要用了。 

链接:

http://solodu.iteye.com/blog/454469

http://songzj.iteye.com/blog/766148 //spring中HibernateDaoSupport会自己关闭session的验证
http://www.iteye.com/topic/1113462 http://bbs.csdn.net/topics/360246898在事务开始的时候打开Session,事务完成后关闭Session,使用Hibernate和Spring都需要这个操作,只不过Spring内部封装好了方法来自动打开和关闭Session,不需要手动关闭了!

【上篇】
【下篇】

抱歉!评论已关闭.