2012-05-28 49 views
2

我有兩個問題:
春天的HibernateTemplate會議

  • 春天在什麼時候關閉是由Spring容器中創建了一個SessionFactory類(SessionFactory則是在容器中定義)?
  • Hibernate默認維護主緩存。緩存的範圍是否限於會話或sessionFactory?我的意思是,什麼時候釋放主緩存的內存?

回答

1

何時彈簧關閉一個由Spring容器創建的會話工廠類(SessionFactory的在容器中所定義的)?

它是自動完成的,當你關閉ApplicationContext(取消部署Web應用程序,正常關閉的JVM等),當容器被關閉它調用的所有豆類DisposableBean接口destroy()方法。這種方法之一是在LocalSessionFactoryBean定義:

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

你不必理會這個在所有。

Hibernate默認維護主緩存。緩存的範圍是否限於會話或sessionFactory?我的意思是,什麼時候釋放主緩存的內存?

「主」高速緩存被稱爲第一級高速緩存並且與會話綁定。第二級高速緩存全局爲SessionFactory,但在SessionFactory關閉時不會發布,因爲很可能您正在使用某種外部高速緩存提供程序,如。如果是這種情況,EhCache也必須關閉以釋放該內存。但是如果使用EhCache支持,這也應該由Spring容器處理。

又見

+0

感謝托馬斯。對於(1),當容器超出範圍時(即容器超出範圍的處理程序),容器是不是關閉?對於(2),我得到內存泄漏,發現原因是Hibernate的主緩存(沒有使用二級緩存)。雖然Spring容器超出了範圍並且會話關閉(使用Statistics類進行檢查),但緩存並未獲得釋放。但是,當我在容器超出範圍之前顯式調用sessionFactory.close()時,他們確實得到了釋放。 – Leo

+0

@Leo:by * container *你的意思是''BeanFactory'上的Springs''ApplicationContext'?關閉它的唯一安全方法是直接調用'.close()'。這是非常不可能的,你在第一級緩存泄漏。您要麼不關閉會話(*不* *'SessionFactory'),要麼在那裏存儲太多的對象(請參閱:Hibernate中的無狀態會話)。 –

+0

其「BeanFactory」。關於關閉會話,我使用'HibernateTemplate'。所以理想情況下,應該爲我處理所有會話管理(我允許這樣做)。關於緩存中的對象太多,儘管使用'getHibernateTemplate.clear()',內存泄漏仍然存在。堆轉儲分析顯示緩存充滿了Hibernate生成的查詢,Hibernate屬性等(但不包括對象)。 – Leo