Spring中使用getSession()与通过HibernateTemplate进行数据操作的差别

在 Spring+Hibernate的继承环境里,如果DAO直接使用HibernateDaoSupport的getSession()方法获取 session进行数据操作而没有显式地关闭该session,那么程序表现为:每个session会打开一个connection,并且 connection会一直保持(因为没有显式地close).如果程序使用了c3p0连接池,则因为c3p0连接池默认最大连接数是15,程序会表现为当打开第15个连接时,程序处于停滞状态,等待从连接池获取新的连接.
  在同样条件下,使用HibernateTemplate进行数据操作,就没有连接数持续增长的情况,程序结束时连接数归零.这印证了spring文档上所说:HibernateTemplate会对session进行了管理,能够确保Session实例的正确打开和关闭.
  需要注意的是:在Spring环境里,即使我们使用Hibernate原生的API,比如这里所说的使用HibernateDaoSupport的 getSession()方法得到Session进行数据操作(而不是使用Spring自己提供的API,比如HibernateTemplate),这些操作也依然会被纳入spring管理的事务中去.原因是通过getSession()方法得到Session是一个绑定到当前事务上的session. 此处可参考:http://www.javaeye.com/topic/110801.这就是为什么Spring文档中提到的:You can implement DAOs based on the plain Hibernate 3 API, while still being able to participate in Spring-managed transactions.
     如果程序使用了OpenSessionInViewFilter或者OpenSessionInViewInterceptor那将是另外一种情形了.

  简单总结:HibernateDaoSupport的getSession()得到的Session会参与Spring管理的事务中,但是不能自动的关闭.HibernateTemplate除能参与到Spring管理的事务中,还能够确保Session实例的正确打开和关闭.

总结:

所以要使用session时,可以使用HibernateCallback对象的doInHibernate()方法参数中的session,执行完成后方法回调session,然后让Spring去管理连接的的打开和关闭。

转载:http://hi.baidu.com/l_rigidity/item/c6ebcc869a6440c9ef083d05

猜你喜欢

转载自hzy2688.iteye.com/blog/1612201
今日推荐