hay 19 métodos en nuestra capa DAO, cada uno es alguna variación de esto:¿Cuál es la forma correcta de garantizar que las conexiones de EntityManager estén cerradas?
public TicketProp saveTicketProp(TicketProp prop) {
EntityManager em = this.emf.createEntityManager();
try {
em.getTransaction().begin();
prop = (TicketProp) em.merge(prop);
em.getTransaction().commit();
return prop;
} finally {
em.close();
}
}
Significado: En cada método en que manejamos nuestra propia transacción y cerrarlo en un bloque finally. Estamos probando una aplicación de Jersey, por lo que nuestras pruebas JUnit extienden JerseyTest. Cada método de prueba instancia un contenedor Grizzly, ejecuta la prueba y luego cierra el contenedor. EntityManagerFactory se inyecta en primavera. Estamos usando JPA sobre Hibernate.
Estoy monitoreando las conexiones a nuestro banco de pruebas MySQL y siempre son altas. Una sola prueba ejecuta la variable "Max_used_connections" de MySQL a 38. Para divertirme, comenté todas las llamadas a em.close() y la prueba todavía usa 38 conexiones.
Estoy utilizando la agrupación de conexiones integrada de Hibernate (no para el uso de prod, lo sé). Todavía esperaba algún tipo de agrupación inteligente.
¿Manejo incorrecto el EntityManager? ¿De qué otra forma puedo cerrar las conexiones?
em.close sólo se libera la conexión a la agrupación de conexiones. emf.close cerrará todas las conexiones. por lo que puede haber demasiada fem creando en su aplicación, por lo que tiene demasiadas conexiones. – Scarlett