我是否必须关闭()每个实体管理器?
2022-08-31 13:11:10
我刚刚开始将我自己开发的持久性框架迁移到 JPA。
鉴于持久性框架隐藏了很多管道,我有兴趣知道不关闭EntityManagers是否会造成资源泄漏,或者框架是否会为我收集并关闭它们。
我打算在所有地方关闭它们,但我必须这样做吗?
目前使用 TopLink,只是因为它很容易与 NetBeans 配合使用,但我很高兴调查其他 JPA 提供商。
我刚刚开始将我自己开发的持久性框架迁移到 JPA。
鉴于持久性框架隐藏了很多管道,我有兴趣知道不关闭EntityManagers是否会造成资源泄漏,或者框架是否会为我收集并关闭它们。
我打算在所有地方关闭它们,但我必须这样做吗?
目前使用 TopLink,只是因为它很容易与 NetBeans 配合使用,但我很高兴调查其他 JPA 提供商。
这取决于您如何获得它。
如果您使用EntityManagerFactory创建了它,那么无论您使用哪种框架,您都必须关闭它。
如果你使用依赖注入(例如使用EJB和@PersistenceContext注释)获得它,你不应该手动关闭它(AFAIK它会导致运行时异常)。
你应该。
框架不知道您打算如何使用EM,因此它们无法关闭它(除非,可能是在最终确定时,这是不能保证的)。是的,不关闭它们会产生资源泄漏。
这个想法与“始终关闭java.sql.Connection”(尽管某些数据源具有通过不活动自动关闭它们)或“始终关闭休眠会话”的设置相同。
此外,如果您打算编写可移植代码,则不应依赖特定的JPA提供程序“聪明” - 其他提供程序可能无法及时关闭EM。