【问题标题】:Spring HibernateTemplate SessionSpring HibernateTemplate 会话
【发布时间】:2012-06-02 20:32:58
【问题描述】:

我有两个问题:

  • Spring 何时关闭 Spring Container 创建的 SessionFactory 类(SessionFactory 是在容器中定义的)?
  • Hibernate 默认维护主缓存。缓存的范围是否仅限于会话或 sessionFactory?我的意思是,主缓存的内存什么时候释放?

【问题讨论】:

    标签: java spring hibernate caching


    【解决方案1】:

    Spring什么时候关闭Spring Container创建的SessionFactory类(SessionFactory是在容器中定义的)?

    当您关闭ApplicationContext(取消部署Web 应用程序,正常关闭JVM 等)时,它会自动完成。当容器关闭时,它会从所有bean 上的DisposableBean 接口调用destroy() 方法。其中一种方法在LocalSessionFactoryBean中定义:

    public void destroy() {
        this.sessionFactory.close();
    }
    

    您完全不必为此烦恼。

    Hibernate 默认维护主缓存。缓存的范围是否仅限于会话或 sessionFactory?我的意思是,主缓存的内存什么时候释放?

    “主”缓存称为一级缓存,与会话相关联。二级缓存对SessionFactory 是全局的,但是当SessionFactory 关闭时它不会被释放,因为很可能您正在使用一些外部缓存提供程序,例如。如果是这种情况,EhCache 也必须关闭以释放该内存。但是如果使用 EhCache 支持,这也应该由 Spring 容器处理。

    另见

    【讨论】:

    • 谢谢托马斯。对于(1),容器超出范围时是否关闭(即容器的处理程序超出范围)?对于(2),我遇到了内存泄漏,发现原因是Hibernate的主缓存(没有使用二级缓存)。尽管 Spring 容器超出范围并且会话关闭(使用统计类检查),但缓存没有被释放。但是,当我在容器超出范围之前明确调用 sessionFactory.close() 时,它们确实被释放了。
    • @Leo: by container 你是说 Springs 在BeanFactory 上的ApplicationContext 吗?关闭它的唯一安全方法是直接调用.close()。您极不可能在一级缓存中发生泄漏。您要么没有关闭会话(not SessionFactory),要么在那里存储了太多对象(请参阅:Hibernate 中的无状态会话)。
    • 它的BeanFactory。关于关闭会话,我使用的是HibernateTemplate。所以理想情况下,它应该为我处理所有会话管理(我允许它这样做)。关于缓存中的太多对象,尽管使用了getHibernateTemplate.clear(),但内存泄漏仍然存在。堆转储分析显示缓存已满,其中包含 Hibernate 生成的查询、Hibernate 属性等(但不是对象)。
    • @Leo:有趣。你还记得 Hibernate 的哪个类持有所有这些引用吗?理想情况下,也许您可​​以制作参考树的屏幕截图?
    • org.hibernate.impl.SessionFactoryObjectFactory 是持有HashMap 的类,而HashMap 又持有大量char[],而这些char[] 占据了大部分内存。参考树看起来像:ContextClassLoader->VectorObj->SessionFactoryObjectFactory->FastHashMap->HashMap
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-30
    • 2011-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多