首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

SSH系统,调用HibernateTemplate.find()步骤的时候,会导致内存泄露

2012-08-29 
SSH系统,调用HibernateTemplate.find()方法的时候,会导致内存泄露?(转自:http://www.iteye.com/problems/1

SSH系统,调用HibernateTemplate.find()方法的时候,会导致内存泄露?

(转自:http://www.iteye.com/problems/1697)

?

?

SSH系统,调用HibernateTemplate.find()方法的时候,会导致内存泄露?

悬赏:5?发布时间:2008-07-18 提问人:robinzhang?(初级程序员)spring2.0.2 hibernate3.1.2 struts2.0.6,web应用运行一段时间之后,内存使用会越来越大直到outofmemory。?
后来测试发现,所有的dao调用了HibernateTemplate.find()之后,内存中就会有org.hibernate.hql.ast.* 这个包中的对象常驻内存,Full gc也不能完全回收(所有用户退出,无活动的session存在)。?
以下是我的代码和配置文件,请指教。?
基类BaseDao的片段?
Java代码??SSH系统,调用HibernateTemplate.find()步骤的时候,会导致内存泄露
  1. public?Object?getObject(Class?clazz,?String[]?fields,?Object[]?values)?{??
  2. ????????List?list?=?getObjectList(clazz,?fields,?values);??
  3. ????????return?(list.size()?>?0)???list.get(0)?:?null;??
  4. ????}??

Service调用?
Java代码??SSH系统,调用HibernateTemplate.find()步骤的时候,会导致内存泄露
  1. Depot?depot?=?(Depot)?depotDao.getObject(Depot.class,?new?String[]?{??
  2. ????????????????"phoneNumber",?"depotId.ringIndex"?},?new?Object[]?{??
  3. ????????????????portalUser.getPhoneNumber(),?ringIndex?});??
  4. ??
  5. ????????if?(depot?==?null)?{??
  6. ????????????return?null;??
  7. ????????}??
  8. ??????????????????//该方法调用HibernateTemplate.get()获取结果??
  9. ????????Ring?ring?=?ringDao.getRing(depot.getDepotId().getRingIndex());??
  10. ????????depot.setChargeable(ring);??
  11. ??
  12. ????????return?depot;??
  13. }??

所有的service方法都定义了事务?
service只要调用该方法,就会导致org.hibernate.hql.ast.* 包中的一些对象常驻内存。?

我不知道hibernate是不是运用了对象池对这些对象进行缓存。如果有的话,也不可能达到100w的级别吧?
我的web应用outofmemory的时候,一般这个时候这个包的对象的总数是百万级别。?

再次谢谢指教?


问题补充:
从我用Jprofiler监测的结果看HibernateTemplate的get(),load()方法都没有问题,只有在调用find的时候会生成一些hql解析的中间变量没有回收回来。?

问题补充:
问题已经解决,是因为自己编写的DAO基类有拼装HQL的行为,而且不是采用的参数化的HQL,所以导致每次查询的时候都会是一条不同的HQL(hibernate会缓存hql的解析结果,应该是通过hql做为Key值来保存)这样hibernate就会保存很多hql的缓存。导致系统运行时间长了之后,内存逐渐被占用直到最后的oom。?

谢谢大家的关注,我关闭问题了。
该问题已经关闭:?自己解决。

热点排行