java jpa persistence toplink

java - ¿Debo cerrar() cada EntityManager?



jpa persistence (3)

Debieras.

Los marcos 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.

Acabo de empezar a migrar mi framework de persistencia de cosecha propia a JPA.

Dado que los marcos de persistencia ocultan muchas 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 de cerrarlos en todos los lugares, pero ¿TENGO que hacerlo?

Por el momento, uso TopLink, simplemente porque funciona con NetBeans fácilmente, pero me complace investigar otros proveedores de JPA.


Depende de cómo lo hayas obtenido.

Si lo creó usando EntityManagerFactory, tendrá que cerrarlo sin importar el marco que use.

Si lo obtuviste usando la inyección de dependencia (por ejemplo, usando la anotación EJB y @PersistenceContext) no deberías cerrarlo a mano (AFAIK causará RuntimeException).


EntityManager usando la anotación @PersistenceContext en mi repositorio. Puedo ver que una vez que los maxPoolSize alcanzan su maxPoolSize , no se limpia.

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