【发布时间】:2012-06-02 20:32:58
【问题描述】:
我有两个问题:
- Spring 何时关闭 Spring Container 创建的 SessionFactory 类(SessionFactory 是在容器中定义的)?
- Hibernate 默认维护主缓存。缓存的范围是否仅限于会话或 sessionFactory?我的意思是,主缓存的内存什么时候释放?
【问题讨论】:
标签: java spring hibernate caching
我有两个问题:
【问题讨论】:
标签: java spring hibernate caching
Spring什么时候关闭Spring Container创建的SessionFactory类(SessionFactory是在容器中定义的)?
当您关闭ApplicationContext(取消部署Web 应用程序,正常关闭JVM 等)时,它会自动完成。当容器关闭时,它会从所有bean 上的DisposableBean 接口调用destroy() 方法。其中一种方法在LocalSessionFactoryBean中定义:
public void destroy() {
this.sessionFactory.close();
}
您完全不必为此烦恼。
Hibernate 默认维护主缓存。缓存的范围是否仅限于会话或 sessionFactory?我的意思是,主缓存的内存什么时候释放?
“主”缓存称为一级缓存,与会话相关联。二级缓存对SessionFactory 是全局的,但是当SessionFactory 关闭时它不会被释放,因为很可能您正在使用一些外部缓存提供程序,例如ehcache。如果是这种情况,EhCache 也必须关闭以释放该内存。但是如果使用 EhCache 支持,这也应该由 Spring 容器处理。
【讨论】:
BeanFactory 上的ApplicationContext 吗?关闭它的唯一安全方法是直接调用.close()。您极不可能在一级缓存中发生泄漏。您要么没有关闭会话(not SessionFactory),要么在那里存储了太多对象(请参阅:Hibernate 中的无状态会话)。
BeanFactory。关于关闭会话,我使用的是HibernateTemplate。所以理想情况下,它应该为我处理所有会话管理(我允许它这样做)。关于缓存中的太多对象,尽管使用了getHibernateTemplate.clear(),但内存泄漏仍然存在。堆转储分析显示缓存已满,其中包含 Hibernate 生成的查询、Hibernate 属性等(但不是对象)。
org.hibernate.impl.SessionFactoryObjectFactory 是持有HashMap 的类,而HashMap 又持有大量char[],而这些char[] 占据了大部分内存。参考树看起来像:ContextClassLoader->VectorObj->SessionFactoryObjectFactory->FastHashMap->HashMap