您的位置:首页 > 编程语言 > Java开发

Spring与Hibernate整合的HibernateDaoSupport应用中的“内存泄露”问题(学习心得)

2007-09-24 10:40 801 查看
Spring是一个开源框架,目前在开源社区的人气很旺,被认为是最有前途的开源框架之一。她是由Rod Johnson创建的,她的诞生是为了简化企业级系统的开发。为了简化我们的开发Spring 整合了许多的开源框架,如:web层的struts webwork jsf等,OR Mapping框架hibernate,ibaits,jdo等,以及其他的表现层技术!大大方便了我们的开发! 我们在使用她的整合来更容易更快捷的开发维护性更强的应用程序! 不在废话了 ,该切入正体了 : )。
我们在使用spring与hibernate的整合的HibernateDaoSupport,我们要只要集成了她,可以使用它的getHibernateTemplate()方法得到一个HibernateTemplate对象来实现数据库的CRUD操作,如果我们想进行复杂的操作比如:批量更新,批量删除,等。这些操作仅仅是HibernateTemplate的几个方法是做不道的,这时候我们就必须通过的到session来进行这些操作,而在管理session的 时候要小心。
[align=left] Session session = getSession();[/align]
[align=left] Transaction transaction = session.beginTransaction();[/align]
[align=left] List<Employee> list = session.createQuery("from Employee where empNo in(:vlist)").setParameterList("vlist", empNos).list();[/align]
[align=left] for (Iterator iter = list.iterator(); iter.hasNext();) {[/align]
[align=left] Employee element = (Employee)iter.next();[/align]
[align=left] session.delete(element);[/align]
[align=left] }[/align]
[align=left] transaction.commit();[/align]
[align=left]session.disconnect();[/align]
return list;
上面的代码已经通过session 完成了批量删除,虽然我们在最后断开了与数据库链接(session.close()方法将会关闭当前session导致其他操作不能执行),但是一些资源还是不能保证被释放,Spring推荐的是不要自己管理session资源的释放,要让容器来自行管理,所以在以上代码中你会发现,它执行不到10几次就会越来越慢,直到内存溢出为止。对上面的问题我们怎么办呢?解决此问题有两种办法。
一、可以换一个SessionFactory工程(OpenSessionInViewInterceptor)来产生一个永远打开的session,这样我们就可以忽略session资源的开与闭。
二、可以用容器自行管理session资源的开与闭,调用一个HibernateCallback回调接口,而HibernateCallback回调接口只要一个方法:
Object doInHibernate(Session session)throws HibernateException,SQLException;
她帮我们管理了session的开与闭。
[align=left]getHibernateTemplate().execute(new HibernateCallback(){[/align]
[align=left]@SuppressWarnings("unchecked")[/align]
[align=left]public Object doInHibernate(Session session) throws HibernateException, SQLException {[/align]
[align=left] Transaction transaction = session.beginTransaction();[/align]
[align=left] List<Employee> list = session.createQuery("from Employee where empNo in(:vlist)").setParameterList("vlist", empNos).list();//.setParameters(empNos,new StringType[]{}).list();[/align]
[align=left] for (Iterator iter = list.iterator(); iter.hasNext();) {[/align]
[align=left] Employee element = (Employee)iter.next();[/align]
[align=left] session.delete(element);[/align]
[align=left] }[/align]
[align=left] transaction.commit();[/align]
[align=left] returnnull;[/align]
[align=left] }[/align]
});
这段代码完成了容器自行管理session。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐