用Struts2+Spring+hibernate集成做了一个项目,发现数据库连接很快就用完了,一调试,是由于在getSession方法之后出现的这个情况,去网上一查,原来getSession获取的是没有经过Spring包装的原始的session,使用完之后不会自动关闭,需要调用手动调用close方法,或者releaseSession(session);而getHibernateTemplate()方法是经过spring封装的,例如添加相应的声明式事务管理,由spring管理相应的连接,所以用getHibernateTemplate().find这些方法之后,spring会帮你控制数据库连接的关闭。
在实际的使用过程中发现的确getHibernateTemplate()比getSession()方法要好很多,但是有些方法在getHibernateTemplate()并没有提供,这时我们用HibernateCallback回调的方法管理数据库.
例如如下代码:
<span style="font-size:18px;">return this.getHibernateTemplate().executeFind(new HibernateCallback(){
public List doInHibernate(Session session) throws HibernateException, SQLException {
Query query=session.createQuery(hqlString);
query.setFirstResult(startRow1);
query.setMaxResults(pageSize1);
return query.list();
}</span>
,基本可以确定通过getSession().connection()获取的connection如果不使用connection.close()的话就释放不了,而且还要session.close(),
但是,如果是配置了OpenSessionInView模式,则getSession拿到的session,Spring就会负责关闭了!