我必须closures()每个EntityManager?
我刚刚开始将我自己创build的持久性框架迁移到JPA。
鉴于持久性框架隐藏了很多pipe道,我有兴趣知道不closuresEntityManagers是否会创build资源泄漏,或者如果框架将为我收集和closures它们。
我打算在所有地方closures他们,但我必须?
目前使用TopLink,只是因为它可以轻松地与NetBeans一起工作,但很高兴能够调查其他JPA提供商。
这取决于你如何获得它。
如果使用EntityManagerFactory创build它,则无论使用什么框架,都必须closures它。
如果你使用dependency injection获得它(例如使用EJB和@PersistenceContext注释),你不应该手动closures它(AFAIK它会导致RuntimeException)。
你应该。
框架不知道你打算如何使用EM,所以他们不能closures它(除了,可能是,在最终确定,这是不能保证)。 是的,不closures它们会造成资源泄漏。
这个想法和“always close java.sql.Connection”一样(尽pipe一些数据源有设置来通过不活动来自动closures它们)或者“总是closuresHibernate会话”。
此外,如果您打算编写可移植代码,则不应该依赖特定的JPA提供程序“变得聪明” – 否则可能无法及时closuresEM。
我已经在我的仓库中使用@PersistenceContext
批注获得了EntityManager
。 我可以看到,在连接maxPoolSize
达到其maxPoolSize
它不会被清理。
但是,如果我使用EntityManagerFactory
创buildEntityManager
并调用entitymanager.close()
则连接正在清理。 我使用c3p0
作为连接库。