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

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

相关文章推荐

hibernate4 和 spring3 整合注意事项:HibernateDaoSupport没有了找到篇好文章,我之前遇到的问题都在这都能找到。其实出现这些问题的关键就是hibernate4和hib

Hibernate4的改动较大只有spring3.1以上版本能够支持,Spring3.1取消了HibernateTemplate,因为Hibernate4的事务管理已经很好了,不用Spring再扩展了...

Spring学习_07_Spring整合Hibernate(HibernateTemplate,HibernateDaoSupport)

Spring整合Hibernate的时候,Spring内部提供了对Hibernate的封装,也就是HibernateTemplate、HibernateDaoSupport这两个类,以前自己写Hibe...

Struts+Hibernate+Spring学习心得(1)Struts

本来是《JavaWeb从入门到精通》读书笔记 第二部分 Struts+Hibernate+Spring的入门部分,但是后面又读了其他JavaWeb的书,对于这一块更深入了,索性就一起写掉了。...

Struts+Hibernate+Spring学习心得(2)Hibernate

Hibernate学习心得

学习心得——数组作为函数参数后sizeof获取不到数组在内存中所占字节数的问题

帮同学解决了一个问题,自己从中也学到了东西,记下学习心得~~~ 问题重现: 数组通过函数传递后为什么获取不到数组在内存中占用地址的长度? 在VS中编写如下的测试代码: #include "st...

Spring整合hibernate:HibernateTemplate和HibernateDaoSupport实现数据库操作

HibernateTemplate:(主要采用spring注入) 其中实现类的配置如下: @Component("userDAOImpl") public class UserDAOImpl impl...

spring与hibernate整合之HibernateDAOSupport

将spring与hibernate进行整合之后,我们都希望用spring来管理DAO层,这样有利于快速实现功能,少出错。今天在研究在DAO层编码,采用继承HibernateDAOSupport方式时,...
  • sthsld
  • sthsld
  • 2016年08月01日 17:24
  • 91

继承HibernateDaoSupport实现DAO(spring整合hibernate)

Spring为Hibernate的DAO提供工具类:HibernateDaoSupport。该类主要提供如下两个方法,方便DAO的实现:    public final HibernateTempla...

Spring 整合 Hibernate、声明式的事务管理、HibernateTemplate(HibernateDaoSupport)

一、在Spring 中 指定datasource    可以使用c3p0、dbcp
  • Troy__
  • Troy__
  • 2014年05月10日 11:19
  • 2255
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Spring与Hibernate整合的HibernateDaoSupport应用中的“内存泄露”问题(学习心得)
举报原因:
原因补充:

(最多只允许输入30个字)