¿Tengo que cerrar () cada EntityManager?


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

Dado que los frameworks de persistencia ocultan gran parte de la plomería, estoy interesado en saber si NO cerrar EntityManagers creará una fuga de recursos, o si los frameworks los recopilarán y cerrarán por mí.

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

En este momento utilizando TopLink, solo porque funciona con NetBeans fácilmente, pero estoy feliz de investigar otros JPA proveedor.

Author: stevemac, 2008-10-21

3 answers

Depende de cómo lo obtuviste.

Si lo creó usando EntityManagerFactory tendrá que cerrarlo sin importar qué marco utilice.

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

 76
Author: jb.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-21 08:23:10

Deberías.

Los frameworks no tienen idea de cómo pretende usar el EM, por lo que no pueden cerrarlo (excepto, puede ser, al finalizar, lo cual no está garantizado). Sí, no cerrarlos crearía una fuga de recursos.

La idea es la misma que "siempre cerrar java.SQL.Conexión "(a pesar de que algunas fuentes de datos tienen configuraciones para cerrarlas automáticamente por inactividad) o"cerrar siempre sesión de Hibernación".

Además, si planea escribir código portátil, no debe confiar en El proveedor de JPA "ser inteligente" other otro puede no cerrar el EM a tiempo.

 11
Author: Vladimir Dyuzhev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-21 01:31:58

He obtenido EntityManager usando @PersistenceContext anotación en mi repositorio. Puedo ver que después de que el connectionpools alcanza su maxPoolSize no se limpia.

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

 4
Author: Puneet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-24 06:56:23