2008-10-21 213 views
61

我剛剛開始將我自己創建的持久性框架遷移到JPA。是否必須關閉()每個EntityManager?

鑑於持久性框架隱藏了很多管道,我有興趣知道是否關閉EntityManagers將創建資源泄漏,或者如果框架將爲我收集並關閉它們。

我打算在所有地方關閉它們,但是我有嗎?

目前使用TopLink只是因爲它很容易與NetBeans協同工作,但很樂意調查其他JPA提供商。

+1

另請參見[應該關閉JPA實體管理器嗎?](http://stackoverflow.com/q/10762974/697630) – 2013-08-12 12:41:53

回答

71

這取決於你如何獲得它。

如果您使用EntityManagerFactory創建它,無論您使用什麼框架,都必須關閉它。

如果您使用依賴注入(例如使用EJB和@PersistenceContext註釋)獲得它,您不應該手動關閉它(AFAIK它會導致RuntimeException)。

+5

從更廣泛的意義上講,EM仍應該關閉。這只是EJB的工作,您可以通過遵守EJB要求來實現。 – 2008-10-21 10:39:56

10

你應該。

框架不知道你打算如何使用EM,所以他們不能關閉它(除了可能,在最終確定,這是不能保證)。是的,不關閉它們會造成資源泄漏。

這個想法和「always close java.sql.Connection」一樣(儘管一些數據源有設置來通過不活動自動關閉它們)或者「總是關閉Hibernate會話」。另外,如果您打算編寫可移植代碼,則不應該依賴特定的JPA提供者「變得聰明」 - 其他人可能無法及時關閉EM。

2

我已經在我的資料庫中使用@PersistenceContext註解獲得了EntityManager。我可以看到,在連接池達到其maxPoolSize後,它不會被清理乾淨。

但是,如果我使用EntityManagerFactory創建EntityManager並呼叫entitymanager.close(),則連接正在清理。我使用c3p0作爲連接池庫。

相關問題