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
 

Spring HibernateTemplate与HibernateDaoSupport对比

HibernateTemplate与HibernateDaoSupport两者都是spring整合hibernate提供的模板技术
  • waysoflife
  • waysoflife
  • 2014年04月06日 02:10
  • 1900

hibernateTemplate以及spring中的hibernateDaosupport的配置

hibernateTemplate org.hibernate.dialect.MySQLDialect true tru...
  • a15134673751
  • a15134673751
  • 2017年05月12日 09:15
  • 406

Spring4 集成 Hibernate3 使用 HibernateTemplate 和使用 HibernateDaoSupport 操作对象

Spring4 集成 Hibernate3 使用 HibernateTemplate 和使用 HibernateDaoSupport 操作对象第一部分:使用 HibernateTemplate基本步骤...
  • lw_power
  • lw_power
  • 2016年05月06日 17:08
  • 3161

Spring集成Hibernate5_03-HibernateDaoSupport

Hibernate中还提供了HibernateDaoSupport继承HibernateDaoSupport, 注入SessionFactory但是报错了, Cannot override the f...
  • wuxintdrh
  • wuxintdrh
  • 2017年09月04日 21:14
  • 498

spring中的HibernateDaoSupport的用法(Session是如何获取的)

HibernateDaoSupport中自带了hibernate的模板供编程者使用。 前提条件:你的类必须继承HibernateDaoSupport 一: 回调函数: public L...
  • Leo_Tung
  • Leo_Tung
  • 2015年03月10日 20:53
  • 907

Spring整合hibernate(4)之BaseDao的编写示例

Spring整合hibernate(4)之BaseDao的编写示例 Spring集成hibernate3和4有一定的区别,目前基本都在使用3,所以此处内容以3为基础; 说明:因为我们在实际编码中会编写...
  • rzg813
  • rzg813
  • 2014年10月12日 20:21
  • 5572

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

一、在Spring 中 指定datasource    可以使用c3p0、dbcp
  • Troy__
  • Troy__
  • 2014年05月10日 11:19
  • 2629

spring与hibernate整合(三种方式)

Spring与Hibernate整合关键点:          1) Hibernate的SessionFactory对象交给Spring创建;          2) hibernate事务交给...
  • u014010769
  • u014010769
  • 2015年07月31日 20:33
  • 3426

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

Spring整合Hibernate的时候,Spring内部提供了对Hibernate的封装,也就是HibernateTemplate、HibernateDaoSupport这两个类,以前自己写Hibe...
  • u010001838
  • u010001838
  • 2015年03月24日 21:06
  • 458

由openSession、getCurrentSession和HibernateDaoSupport浅谈Spring对事物的支持

Spring和Hibernate的集成的一个要点就是对事务的支持,openSession、getCurrentSession都是编程式事务(手动设置事务的提交、回滚)中重要的对象,HibernateD...
  • lmdcszh
  • lmdcszh
  • 2013年10月31日 22:45
  • 7152
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Spring与Hibernate整合的HibernateDaoSupport应用中的“内存泄露”问题(学习心得)
举报原因:
原因补充:

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