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

 
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
 
阅读更多
上一篇Struts 2框架搭建(Hello World)
下一篇ios 游戏《魂斗罗》 AL文件素材破解
想对作者说点什么? 我来说一句

spring-boot 集成hibernate

2017年01月10日 20KB 下载

Spring相关测试4

2015年05月06日 43.16MB 下载

springMVC+hibernate+mybatis整合

2016年10月19日 1.27MB 下载

springboot集成hibernate

2017年05月22日 15KB 下载

Spring整合Hibernate示例

2015年11月16日 14.19MB 下载

Spring SpringMVC Hibernate整合

2017年08月31日 40.25MB 下载

springhibernate整合

2009年07月30日 11.52MB 下载

spring+hibernate整合jar包

2017年01月16日 12.93MB 下载

没有更多推荐了,返回首页

关闭
关闭