我必须 close() 每个 EntityManager 吗?

发布于 2024-07-07 19:00:09 字数 210 浏览 8 评论 0原文

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

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

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

目前使用 TopLink,只是因为它可以轻松地与 NetBeans 配合使用,但我很乐意研究其他 JPA 提供商。

I have just started migrating my homegrown persistence framework to JPA.

Given that the persistence frameworks hide a lot of the plumbing, I'm interested in knowing if NOT closing EntityManagers will create a resource leak, or if the frameworks will collect and close them for me.

I intend in all places to close them, but do I HAVE to?

At the moment using TopLink, just because it works with NetBeans easily, but am happy to investigate other JPA providers.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

回忆追雨的时光 2024-07-14 19:00:09

这取决于您如何获得它。

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

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

It depends how you obtained it.

If you created it using EntityManagerFactory you will have to close it no matter what framework you use.

If you obtained it using dependency injection (eg using EJB and @PersistenceContext annotation) you should not close it by hand (AFAIK it will cause RuntimeException).

空心↖ 2024-07-14 19:00:09

你应该。

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

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

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

You should.

Frameworks have no idea how you intend to use the EM, so they cannot close it (except, may be, on finalization, which is not guaranteed). Yes, not closing them would create a resource leak.

The idea is the same as "always close java.sql.Connection" (despite some data sources have settings to close them automatically by inactivity) or "always close Hibernate session".

Besides, if you plan to write portable code, you shouldn't rely on specific JPA provider "being smart" -- other may fail to close the EM in time.

记忆之渊 2024-07-14 19:00:09

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

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

I have obtained EntityManager using @PersistenceContext annotation in my repository. I can see that after the connectionpools reaches its maxPoolSize it does not get cleaned up.

However if I create EntityManager using EntityManagerFactory and call entitymanager.close() then connections are getting cleaned up. I am using c3p0 as connectionpool library.

彡翼 2024-07-14 19:00:09

只是为了给我 5 美分,你必须记住关闭你的 EntityManagerFactory。
我只是用它来创建我的 EntityManager,它每次都会打开并保持打开一个新的连接池。

Justo to give my 5 cents you must remember to close your EntityManagerFactory.
I was just using it to create my EntityManager and it opened and kept opend a new conection pool every time.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文