(转自:http://www.iteye.com/problems/1697)
悬赏: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的片段
- public Object getObject(Class clazz, String[] fields, Object[] values) {
- List list = getObjectList(clazz, fields, values);
- return (list.size() > 0) ? list.get(0) : null;
- }
Service调用
- Depot depot = (Depot) depotDao.getObject(Depot.class, new String[] {
- "phoneNumber", "depotId.ringIndex" }, new Object[] {
- portalUser.getPhoneNumber(), ringIndex });
-
- if (depot == null) {
- return null;
- }
-
- Ring ring = ringDao.getRing(depot.getDepotId().getRingIndex());
- depot.setChargeable(ring);
-
- return depot;
- }
所有的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。
谢谢大家的关注,我关闭问题了。
该问题已经关闭: 自己解决。
分享到:
相关推荐
gethibernatetemplate的find方法,find(String queryString);find(String queryString , Object value);find(String queryString, Object[] values);findByExample(Object exampleEntity);findByExample(Object ...
HibernateTemplate.saveOrUpdate时出现\xE7\x84十六进制之类的字符串,连接数据库字符串,数据库字符集,汉字乱码的问题集合,还有我熬3夜的血泪经历
hibernateTemplate常用方法.htm
hibernateTemplate的常用方法
ssh(客户管理系统) 开发环境:eclipse+tomcat8.5+MYSQL5.5+SVN 软件架构:Struts2 + hibernate5.x + spring4.x + mysql数据库 开发时间:2019.12-2019.1 开发人数:1人 项目描述:功能模块划分 第一个 ...
HibernateTemplate 的常规用法.doc HibernateTemplate 的常规用法.doc
HibernateTemplate的方法部分使用,还有部分的个人见解,有错的,请指出,谢谢
SSH2增删改查使用HibernateTemplate
spring HibernateTemplate汇总
TfileDAOHibernate通过扩展Spring提供的Hibernate支持类HibernateDaoSupport而建立,HibernateDaoSupport封装了HibernateTemplate,而HibernateTemplate封装了Hibernate所提供几乎所有的的数据操作方法,如execute...
...............................................................................................................................23 setter 方法注入:.........................................................
HibernateTemplate及generator用法.docHibernateTemplate及generator用法.doc
Spring整合hibernate(2)之基于HibernateTemplate的整合,jar需要自己添加!
对Spring框架中,HibernateTemplate的使用,底层dao中HibernateTemplate的使用以及HibernateCallBack调用等等
HibernateTemplate及generator用法.docxHibernateTemplate及generator用法.docx
HibernateTemplate的简单示例
HibernateTemplat技术,此文档详细描述了HibernateTemplate的方法及功能说明,并有实例。
HibernateTemplate的用法总结,我自己整理的,仅供参考
关于使用HibernateTemplate