我刚刚开始将我自己开发的持久性框架迁移到 JPA。
鉴于持久性框架隐藏了很多管道,我很想知道不关闭 EntityManagers 是否会造成资源泄漏,或者框架是否会为我收集并关闭它们。
我打算在所有地方关闭它们,但我必须这样做吗?
目前使用 TopLink,只是因为它很容易与 NetBeans 一起工作,但很高兴研究其他 JPA 提供程序。
我刚刚开始将我自己开发的持久性框架迁移到 JPA。
鉴于持久性框架隐藏了很多管道,我很想知道不关闭 EntityManagers 是否会造成资源泄漏,或者框架是否会为我收集并关闭它们。
我打算在所有地方关闭它们,但我必须这样做吗?
目前使用 TopLink,只是因为它很容易与 NetBeans 一起工作,但很高兴研究其他 JPA 提供程序。
这取决于你如何获得它。
如果您使用 EntityManagerFactory 创建它,则无论您使用什么框架,都必须关闭它。
如果您使用依赖注入(例如使用 EJB 和 @PersistenceContext 注释)获得它,则不应手动关闭它(AFAIK 它将导致 RuntimeException)。
你应该。
框架不知道您打算如何使用 EM,因此它们无法关闭它(除非,可能是在最终确定时,这不能保证)。是的,不关闭它们会造成资源泄漏。
这个想法与“始终关闭 java.sql.Connection”(尽管某些数据源具有通过不活动自动关闭它们的设置)或“始终关闭 Hibernate 会话”相同。
此外,如果您打算编写可移植代码,则不应依赖特定的 JPA 提供者“聪明”——其他可能无法及时关闭 EM。
我在我的存储库中获得了EntityManager
使用@PersistenceContext
注释。我可以看到,在连接池到达它之后,maxPoolSize
它并没有被清理。
但是,如果我创建EntityManager
usingEntityManagerFactory
并调用,entitymanager.close()
则连接将被清理。我正在c3p0
用作连接池库。