Pregunta

Acabo de comenzar a migrar mi marco de persistencia de cosecha propia a JPA.

Dado que los marcos de persistencia ocultan gran parte de la fontanería, me interesa saber si NO cerrar EntityManagers creará una pérdida 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 ¿DEBO hacerlo?

Actualmente utilizo TopLink, solo porque funciona con NetBeans fácilmente, pero me complace investigar a otros proveedores de JPA.

¿Fue útil?

Solución

Depende de cómo lo obtuviste.

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

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

Otros consejos

Deberías.

Los marcos no tienen idea de cómo piensa utilizar el EM, por lo que no pueden cerrarlo (excepto, puede ser, al finalizar, lo que no está garantizado). Sí, no cerrarlos crearía una pérdida de recursos.

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

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

He obtenido EntityManager usando la anotación @PersistenceContext en mi repositorio. Puedo ver que después de que los grupos de conexión alcanzan su maxPoolSize no se limpian.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top