2
我有兩個問題:
春天的HibernateTemplate會議
- 春天在什麼時候關閉是由Spring容器中創建了一個SessionFactory類(SessionFactory則是在容器中定義)?
- Hibernate默認維護主緩存。緩存的範圍是否限於會話或sessionFactory?我的意思是,什麼時候釋放主緩存的內存?
我有兩個問題:
春天的HibernateTemplate會議
何時彈簧關閉一個由Spring容器創建的會話工廠類(SessionFactory的在容器中所定義的)?
它是自動完成的,當你關閉ApplicationContext
(取消部署Web應用程序,正常關閉的JVM等),當容器被關閉它調用的所有豆類DisposableBean
接口destroy()
方法。這種方法之一是在LocalSessionFactoryBean
定義:
public void destroy() {
this.sessionFactory.close();
}
你不必理會這個在所有。
Hibernate默認維護主緩存。緩存的範圍是否限於會話或sessionFactory?我的意思是,什麼時候釋放主緩存的內存?
「主」高速緩存被稱爲第一級高速緩存並且與會話綁定。第二級高速緩存全局爲SessionFactory
,但在SessionFactory
關閉時不會發布,因爲很可能您正在使用某種外部高速緩存提供程序,如ehcache。如果是這種情況,EhCache也必須關閉以釋放該內存。但是如果使用EhCache支持,這也應該由Spring容器處理。
感謝托馬斯。對於(1),當容器超出範圍時(即容器超出範圍的處理程序),容器是不是關閉?對於(2),我得到內存泄漏,發現原因是Hibernate的主緩存(沒有使用二級緩存)。雖然Spring容器超出了範圍並且會話關閉(使用Statistics類進行檢查),但緩存並未獲得釋放。但是,當我在容器超出範圍之前顯式調用sessionFactory.close()時,他們確實得到了釋放。 – Leo
@Leo:by * container *你的意思是''BeanFactory'上的Springs''ApplicationContext'?關閉它的唯一安全方法是直接調用'.close()'。這是非常不可能的,你在第一級緩存泄漏。您要麼不關閉會話(*不* *'SessionFactory'),要麼在那裏存儲太多的對象(請參閱:Hibernate中的無狀態會話)。 –
其「BeanFactory」。關於關閉會話,我使用'HibernateTemplate'。所以理想情況下,應該爲我處理所有會話管理(我允許這樣做)。關於緩存中的對象太多,儘管使用'getHibernateTemplate.clear()',內存泄漏仍然存在。堆轉儲分析顯示緩存充滿了Hibernate生成的查詢,Hibernate屬性等(但不包括對象)。 – Leo