我必须关闭()每个 EntityManager 吗?

Posted

技术标签:

【中文标题】我必须关闭()每个 EntityManager 吗?【英文标题】:Do I have to close() every EntityManager? 【发布时间】:2010-09-18 05:38:35 【问题描述】:

我刚刚开始将我自己开发的持久性框架迁移到 JPA。

鉴于持久性框架隐藏了很多管道,我很想知道不关闭 EntityManagers 是否会造成资源泄漏,或者框架是否会为我收集并关闭它们。

我打算在所有地方关闭它们,但我必须这样做吗?

目前使用 TopLink,只是因为它很容易与 NetBeans 配合使用,但很高兴研究其他 JPA 提供程序。

【问题讨论】:

另见Should the JPA entity manager be closed? 【参考方案1】:

我在我的存储库中使用@PersistenceContext 注释获得了EntityManager。我可以看到,在连接池到达其maxPoolSize 后,它并没有被清理。

但是,如果我使用EntityManagerFactory 创建EntityManager 并调用entitymanager.close(),那么连接就会被清理。我使用c3p0 作为连接池库。

【讨论】:

【参考方案2】:

这取决于你如何获得它。

如果您使用 EntityManagerFactory 创建它,则无论您使用什么框架,都必须关闭它。

如果您使用依赖注入(例如使用 EJB 和 @PersistenceContext 注释)获得它,则不应手动关闭它(AFAIK 它将导致 RuntimeException)。

【讨论】:

在更广泛的意义上,EM 仍然应该关闭。这只是 EJB 为您完成的工作,您通过遵守 EJB 要求使其成为可能。【参考方案3】:

你应该。

Frameworks 不知道您打算如何使用 EM,因此它们无法关闭它(除非可能是在最终确定时,但不能保证)。是的,不关闭它们会造成资源泄漏。

这个想法与“总是关闭 java.sql.Connection”(尽管某些数据源具有通过不活动自动关闭它们的设置)或“总是关闭 Hibernate 会话”相同。

此外,如果您打算编写可移植代码,则不应依赖特定的 JPA 提供者“聪明”——其他可能无法及时关闭 EM。

【讨论】:

以上是关于我必须关闭()每个 EntityManager 吗?的主要内容,如果未能解决你的问题,请参考以下文章

EntityManager 已关闭?

EntityManager 已关闭

Shopware 客户导入错误:EntityManager 已关闭

使用 JPA EntityManager 进行批量插入

我们是不是需要在选择调用时关闭 EntityManager 资源

使用 JPA.withTransaction 的测试 Actor(java.lang.IllegalStateException:EntityManager 在测试时关闭)