本文共 1408 字,大约阅读时间需要 4 分钟。
在 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.此处可参考:.这就是为什么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实例的正确打开和关闭. 在myeclipse10.6中使用生成springDAO时,如果是
hibernate4会直接生成
getCurrentSession().save(transientInstance)因为,
hibernate4之后spring就没提供hibernateTemplate了;没有使用事务啊,没有关闭Session的操作。生成继承于BaseHibernateDAO的DAO是getSession().save(transientInstance);基本上没什么区别啊。
spring in action中说既然有了session就不需要再使用
HibernateTemplate ,直接使用getsession()就好,可是为什么在网上查的都是用HibernateTemplate 比较好呢。
群里询问,是说有HibernateTemplate 的封装当然好一些。但是现在都没用hibernate了 在用springdatajpa 写个方法名就搞定了 hql sql 都没有 也没有什么getsession
转载地址:http://jdnsi.baihongyu.com/