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。
我们在使用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。
相关文章推荐
- Spring与Hibernate整合的HibernateDaoSupport应用中的“内存泄露”问题(学习心得)
- Spring学习_07_Spring整合Hibernate(HibernateTemplate,HibernateDaoSupport)
- hibernate4 和 spring3 整合注意事项:HibernateDaoSupport没有了找到篇好文章,我之前遇到的问题都在这都能找到。其实出现这些问题的关键就是hibernate4和hib
- 使用Spring的HibernateDaoSupport时的getSession()方法相关问题
- Spring学习笔记-HibernateTemplate和HibernateDaoSupport
- spring的HibernateDaoSupport以及HibernateTemplate和jdbcTemplate的选择问题
- HibernateTemplate和HibernateDaoSupport(spring注入问题)
- HibernateTemplate和HibernateDaoSupport(spring注入问题)
- spring的HibernateDaoSupport以及HibernateTemplate和jdbcTemplate的选择问题
- spring与hibernate整合之HibernateDAOSupport
- spring的HibernateDaoSupport以及HibernateTemplate和jdbcTemplate的选择问题
- HibernateTemplate和HibernateDaoSupport(spring注入问题)
- spring与hibernate整合之:继承HibernateDAOSupport方式+理解xml与AutoWired、Resource的区别
- HibernateTemplate和HibernateDaoSupport(spring注入问题)
- Spring整合Hibernate,不用HibernateDaoSupport与HibernateTemplate而用Hibernate自己的api分析说明
- spring的HibernateDaoSupport以及HibernateTemplate和jdbcTemplate的选择问题
- spring的HibernateDaoSupport以及HibernateTemplate和jdbcTemplate的选择问题
- Spring 的 HibernateDaoSupport 类的 getSession() 导致的连接泄露问题
- 【Java EE 学习 53】【Spring学习第五天】【Spring整合Hibernate】【Spring整合Hibernate、Struts2】【问题:整合hibernate之后事务不能回滚】
- HibernateTemplate和HibernateDaoSupport(spring注入问题)