我剛剛開始將我自己創建的持久性框架遷移到JPA。是否必須關閉()每個EntityManager?
鑑於持久性框架隱藏了很多管道,我有興趣知道是否關閉EntityManagers將創建資源泄漏,或者如果框架將爲我收集並關閉它們。
我打算在所有地方關閉它們,但是我有嗎?
目前使用TopLink只是因爲它很容易與NetBeans協同工作,但很樂意調查其他JPA提供商。
我剛剛開始將我自己創建的持久性框架遷移到JPA。是否必須關閉()每個EntityManager?
鑑於持久性框架隱藏了很多管道,我有興趣知道是否關閉EntityManagers將創建資源泄漏,或者如果框架將爲我收集並關閉它們。
我打算在所有地方關閉它們,但是我有嗎?
目前使用TopLink只是因爲它很容易與NetBeans協同工作,但很樂意調查其他JPA提供商。
這取決於你如何獲得它。
如果您使用EntityManagerFactory創建它,無論您使用什麼框架,都必須關閉它。
如果您使用依賴注入(例如使用EJB和@PersistenceContext註釋)獲得它,您不應該手動關閉它(AFAIK它會導致RuntimeException)。
從更廣泛的意義上講,EM仍應該關閉。這只是EJB的工作,您可以通過遵守EJB要求來實現。 – 2008-10-21 10:39:56
你應該。
框架不知道你打算如何使用EM,所以他們不能關閉它(除了可能,在最終確定,這是不能保證)。是的,不關閉它們會造成資源泄漏。
這個想法和「always close java.sql.Connection」一樣(儘管一些數據源有設置來通過不活動自動關閉它們)或者「總是關閉Hibernate會話」。另外,如果您打算編寫可移植代碼,則不應該依賴特定的JPA提供者「變得聰明」 - 其他人可能無法及時關閉EM。
我已經在我的資料庫中使用@PersistenceContext
註解獲得了EntityManager
。我可以看到,在連接池達到其maxPoolSize
後,它不會被清理乾淨。
但是,如果我使用EntityManagerFactory
創建EntityManager
並呼叫entitymanager.close()
,則連接正在清理。我使用c3p0
作爲連接池庫。
另請參見[應該關閉JPA實體管理器嗎?](http://stackoverflow.com/q/10762974/697630) – 2013-08-12 12:41:53