使用Hibernate进行高GC负载

时间:2014-01-29 15:18:45

标签: java spring hibernate spring-mvc garbage-collection

我使用Spring MVC + Hibernate开发了一个Web应用程序,在运行负载测试时,似乎经常调用垃圾收集器。我担心这可能与我管理Hibernates会话的方式有关。

我有一个AbstractDao,我的所有DAO对象都扩展了:

public class AbstractDaoHibernateImpl {

    protected GenericDataBaseExceptionHandler exceptionHandler;
    private SessionFactory sessionFactory;  

    public AbstractDaoHibernateImpl() {
    }

    public void setExceptionHandler(GenericDataBaseExceptionHandler exceptionHandler) {
        this.exceptionHandler = exceptionHandler;
    }

    public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }

    protected Session getSession() {
        return sessionFactory.getCurrentSession();
    }

}

在spring entity bean配置中,我定义了我的每个DAO:

   <bean name="userDao" class="com.kelmer.dao.UserDaoImpl">
        <property name="sessionFactory" ref="SessionFactory" />
        <property name="exceptionHandler" ref="defaultSpringExceptionHandler" />
    </bean>

然后这是我的一个DAO的示例方法:

    @Override
    public EstacionVO findById(Long id) throws InstanceNotFoundException {
        User e = (User ) getSession().createQuery(SELECT_USER_BY_ID).setParameter("userId", id).uniqueResult();
        if (e == null) {
            throw new InstanceNotFoundException ("No user with provided Id", User.class);
        }
        return e;
    }

老实说,我可以看到任何可能导致内存泄漏的事情,但话说再说我不是真正的专家。我在做会话管理吗?我知道我从一些遗留代码中抽取了AbstractDao的代码,我担心这可能是内存问题所在,因为没有明确的会话结束或最终确定。

PS。对于事务管理,我在spring上下文中使用<tx:annotation-driven />并使用@Transactional注释每个方法。

2 个答案:

答案 0 :(得分:2)

乍一看,您的代码中似乎没有任何异常。

运行性能监视器以查看创建了哪些对象。

除非问题是微不足道的,否则通过查看代码和90%的时间很难看出性能损失在哪里,任何声明“它一定是这个”都证明是错误的。

答案 1 :(得分:1)

你的hibernate会话创建策略是什么?您的代码是否一次又一次地使用相同的会话? 而不是:

protected Session getSession() {
    return sessionFactory.getCurrentSession();
}

尝试为每个请求打开一个新会话:

protected Session getSession() {
    return sessionFactory.openSession();
}

每个会话都有一个会话缓存,所有检索或持久化的对象都添加到该会话缓存中。如果您继续使用相同的会话来查询许多实体,它可能会导致这种情况。

尝试更改,如果有帮助,请告诉我们。

正确的方式

使用其中一个性能监控工具查看导致问题的原因:
http://java.dzone.com/articles/java-performance-troubleshooti-0