2008-10-21 79 views
61

Acabo de empezar a migrar mi framework de persistencia de cosecha propia a JPA.¿Debo cerrar() cada EntityManager?

Dado que los marcos de persistencia esconden una gran parte de las tuberías, me interesa saber si NO cerrar EntityManagers creará una fuga de recursos, o si los marcos los recopilarán y cerrarán por mí.

Tengo la intención en todos los lugares para cerrarlos, pero ¿TENGO que hacerlo?

Actualmente usando TopLink, simplemente porque funciona con NetBeans fácilmente, pero me complace investigar otros proveedores de JPA.

+1

Véase también [¿Debería cerrarse el administrador de entidades JPA?] (Http://stackoverflow.com/q/10762974/697630) –

Respuesta

71

Depende de cómo lo haya obtenido.

Si lo creó utilizando EntityManagerFactory, tendrá que cerrarlo sin importar el marco que utilice.

Si lo obtuvo utilizando la inyección de dependencia (por ejemplo, utilizando EJB y la anotación @PersistenceContext) no debe cerrarlo a mano (AFAIK causará RuntimeException).

+5

En un sentido más amplio, el EM aún debe estar cerrado. Es solo que EJB hace el trabajo para usted y lo hace posible al cumplir con los requisitos de EJB. –

10

Deberías.

Frameworks no tienen idea de cómo piensa utilizar el EM, por lo que no pueden cerrarlo (excepto, puede ser, en la finalización, que no está garantizado). Sí, no cerrarlos crearía una fuga de recursos.

La idea es la misma que "siempre cierre java.sql.Connection" (a pesar de que algunas fuentes de datos tienen configuraciones para cerrarlas automáticamente por inactividad) o "siempre cierre la sesión de Hibernate".

Además, si planea escribir código portátil, no debe confiar en que el proveedor específico de JPA sea "inteligente"; es posible que otros no cierren el EM a tiempo.

2

He obtenido EntityManager utilizando la anotación @PersistenceContext en mi repositorio. Puedo ver que después de que los connectionpools alcanzan su maxPoolSize, no se limpia.

Sin embargo, si creo EntityManager usando EntityManagerFactory y llamo al entitymanager.close(), las conexiones se están limpiando. Estoy usando c3p0 como biblioteca de conexión.

Cuestiones relacionadas