0 0

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

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;
		}
                  //该方法调用HibernateTemplate.get()获取结果
		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。

谢谢大家的关注,我关闭问题了。
2008年7月18日 18:08

1个答案 按时间排序 按投票排序

0 0

关注,建议看看HibernateTemplate.get()方法的原码,看他里面用什么Hibernate的方法再找原因!

2008年7月19日 10:06

相关推荐

    SSH2增删改查使用HibernateTemplate

    在实际开发中,为了事务的一致性,通常会将这些操作包裹在`@Transactional`注解的方法中,确保数据库操作的原子性和一致性。 总结起来,SSH2框架中的HibernateTemplate为开发者提供了一个简洁的API,以处理数据库的...

    HibernateTemplate及generator用法.doc

    2. 使用`getHibernateTemplate()`,然后调用其提供的方法,如`getHibernateTemplate().find()`等。 通常推荐使用`getHibernateTemplate()`,因为它的优点在于管理Session更为高效。在一个线程内进行多次操作时,`...

    HibernateTemplate及generator用法.docx

    在SSH或SSH2中,你可以通过以下两种方式调用Hibernate的相关操作: 1. 使用`super.getSession().A();` 2. 使用`getHibernateTemplate().B();` 关于这两种方式的选择,大多数情况下推荐使用`getHibernateTemplate()...

    ssh整合下的通用泛型DAO+分页

    这通常涉及到使用`HibernateTemplate`的`find()`方法,配合HQL(Hibernate Query Language)或SQL来获取指定范围的结果集。例如: ```java public List<User> findByPage(int pageSize, int currentPage) { ...

    SSH基础上分页功能的实现

    在SSH基础上实现分页功能,主要是为了处理大数据量的查询结果,提高用户体验,避免一次性加载过多数据导致页面加载缓慢或者内存压力过大。下面将详细讲解SSH框架下分页功能的原理和实现步骤。 首先,理解分页的基本...

    ssh(structs,spring,hibernate)框架中的上传下载

     TfileDAOHibernate通过扩展Spring提供的Hibernate支持类HibernateDaoSupport而建立,HibernateDaoSupport封装了HibernateTemplate,而HibernateTemplate封装了Hibernate所提供几乎所有的的数据操作方法,如execute...

    我的智囊团(SSH)01--07学习笔记

    DAO类中的其他方法如`getPersons()`、`getPerson()`和`savePerson()`则直接调用`HibernateTemplate`的相应方法来执行数据库操作。 使用`HibernateTemplate`的好处在于它自动处理了事务管理、异常转换和资源关闭等...

    SSH整合开发中的分页显示

    `getAllRowCount`方法则直接调用`find`方法并返回结果的大小,从而得到总记录数。 接着,为了更好地管理和传递分页信息,我们创建了一个`PageBean`类。这个类包含了四个属性:`list`存储了当前页的数据,`allRow`...

    SSH整合技术

    它允许我们在需要时才加载关联的对象,避免一次性加载大量数据导致内存占用过高。通过在实体类的关联关系上配置懒加载,可以在调用关联属性时自动触发数据库查询。 在SSH项目中,进行修改操作通常涉及Service层的...

    SSH实现分页查

    ### SSH实现分页查询知识点详解 ...这种方法不仅可以提高系统的响应速度,还能提升用户的使用体验。在实际项目开发中,建议根据具体的业务场景进一步优化和完善分页查询的逻辑,以满足更多复杂的需求。

    hibernateDaoSupport类的运用实例

    4. **查询执行**:提供了一系列基于`HibernateTemplate`的方法来执行HQL和Native SQL查询。 #### 三、具体实现步骤 ##### 1. 类继承与配置 在本例中,我们创建了一个名为`SshDAO`的类,该类继承自`...

    java之SSH常见面试题

    Spring 通过 `HibernateTemplate` 提供对 Hibernate 的集成,提供 save, update, delete, find 等操作。如果配置了声明式事务,这些操作会自动在事务中执行。如果没有事务配置,操作可能不会立即持久化到数据库,...

    java ssh 面试题

    - **Spring 为 Hibernate 提供了良好的集成支持,** 例如通过 `HibernateTemplate` 提供了一系列方便的方法,如 `save()`, `update()`, `delete()`, `find()` 等。如果配置了声明式事务管理,这些操作会自动与事务相...

    struts2+hirbate+spring面试题

    Struts2的Action类默认情况下不是线程安全的,因为多个请求可能会共享同一个Action实例,导致数据冲突。确保Action线程安全的方法包括:声明局部变量、扩展RequestProcessor以每次创建新的Action实例,或者在Spring...

    真是一个很好的分页例子

    在SSH(Spring、Struts2、Hibernate)框架集成的项目中,分页技术是一个关键的组成部分,用于提高用户体验和系统性能。在这个例子中,我们将探讨如何实现基于Hibernate的分页功能,以及如何在DAO层和业务逻辑层进行...

    HibernateDaoSupport与JdbcDaoSupport

    该类为子类提供了一个名为`hibernateTemplate`的属性,可以通过它调用一系列预定义的方法来进行数据库操作(如查询、更新等)。 - **示例代码**: ```java public class TestA extends HibernateDaoSupport { ...

Global site tag (gtag.js) - Google Analytics