(转自: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。
谢谢大家的关注,我关闭问题了。
该问题已经关闭: 自己解决。
分享到:
相关推荐
在实际开发中,为了事务的一致性,通常会将这些操作包裹在`@Transactional`注解的方法中,确保数据库操作的原子性和一致性。 总结起来,SSH2框架中的HibernateTemplate为开发者提供了一个简洁的API,以处理数据库的...
2. 使用`getHibernateTemplate()`,然后调用其提供的方法,如`getHibernateTemplate().find()`等。 通常推荐使用`getHibernateTemplate()`,因为它的优点在于管理Session更为高效。在一个线程内进行多次操作时,`...
在SSH或SSH2中,你可以通过以下两种方式调用Hibernate的相关操作: 1. 使用`super.getSession().A();` 2. 使用`getHibernateTemplate().B();` 关于这两种方式的选择,大多数情况下推荐使用`getHibernateTemplate()...
这通常涉及到使用`HibernateTemplate`的`find()`方法,配合HQL(Hibernate Query Language)或SQL来获取指定范围的结果集。例如: ```java public List<User> findByPage(int pageSize, int currentPage) { ...
在SSH基础上实现分页功能,主要是为了处理大数据量的查询结果,提高用户体验,避免一次性加载过多数据导致页面加载缓慢或者内存压力过大。下面将详细讲解SSH框架下分页功能的原理和实现步骤。 首先,理解分页的基本...
TfileDAOHibernate通过扩展Spring提供的Hibernate支持类HibernateDaoSupport而建立,HibernateDaoSupport封装了HibernateTemplate,而HibernateTemplate封装了Hibernate所提供几乎所有的的数据操作方法,如execute...
DAO类中的其他方法如`getPersons()`、`getPerson()`和`savePerson()`则直接调用`HibernateTemplate`的相应方法来执行数据库操作。 使用`HibernateTemplate`的好处在于它自动处理了事务管理、异常转换和资源关闭等...
`getAllRowCount`方法则直接调用`find`方法并返回结果的大小,从而得到总记录数。 接着,为了更好地管理和传递分页信息,我们创建了一个`PageBean`类。这个类包含了四个属性:`list`存储了当前页的数据,`allRow`...
它允许我们在需要时才加载关联的对象,避免一次性加载大量数据导致内存占用过高。通过在实体类的关联关系上配置懒加载,可以在调用关联属性时自动触发数据库查询。 在SSH项目中,进行修改操作通常涉及Service层的...
### SSH实现分页查询知识点详解 ...这种方法不仅可以提高系统的响应速度,还能提升用户的使用体验。在实际项目开发中,建议根据具体的业务场景进一步优化和完善分页查询的逻辑,以满足更多复杂的需求。
4. **查询执行**:提供了一系列基于`HibernateTemplate`的方法来执行HQL和Native SQL查询。 #### 三、具体实现步骤 ##### 1. 类继承与配置 在本例中,我们创建了一个名为`SshDAO`的类,该类继承自`...
Spring 通过 `HibernateTemplate` 提供对 Hibernate 的集成,提供 save, update, delete, find 等操作。如果配置了声明式事务,这些操作会自动在事务中执行。如果没有事务配置,操作可能不会立即持久化到数据库,...
Struts2的Action类默认情况下不是线程安全的,因为多个请求可能会共享同一个Action实例,导致数据冲突。确保Action线程安全的方法包括:声明局部变量、扩展RequestProcessor以每次创建新的Action实例,或者在Spring...
在SSH(Spring、Struts2、Hibernate)框架集成的项目中,分页技术是一个关键的组成部分,用于提高用户体验和系统性能。在这个例子中,我们将探讨如何实现基于Hibernate的分页功能,以及如何在DAO层和业务逻辑层进行...
该类为子类提供了一个名为`hibernateTemplate`的属性,可以通过它调用一系列预定义的方法来进行数据库操作(如查询、更新等)。 - **示例代码**: ```java public class TestA extends HibernateDaoSupport { ...