关闭

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

标签: hibernatespringsessioniterator框架struts
2114人阅读 评论(1) 收藏 举报
 
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
 
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:38342次
    • 积分:445
    • 等级:
    • 排名:千里之外
    • 原创:13篇
    • 转载:0篇
    • 译文:0篇
    • 评论:12条
    文章分类
    最新评论