Foros del Web » Programación para mayores de 30 ;) » Java »

[SOLUCIONADO] PostrgreSQL no cierra conexiones en JavaEE

Estas en el tema de PostrgreSQL no cierra conexiones en JavaEE en el foro de Java en Foros del Web. Hola, tengo un método que abre una conexion para devolver un resultado con el que se genera un reporte, el problema es que veo en ...
  #1 (permalink)  
Antiguo 28/01/2016, 09:04
Avatar de Hyemin  
Fecha de Ingreso: agosto-2014
Mensajes: 147
Antigüedad: 9 años, 8 meses
Puntos: 0
PostrgreSQL no cierra conexiones en JavaEE

Hola, tengo un método que abre una conexion para devolver un resultado con el que se genera un reporte, el problema es que veo en el monitor de PostgreSQL que las conexiones se abren y no se cierran nunca.

Llega a un punto en donde el server directamente se muere aunque cierre el entitymanager creado.

Agradezco cualquier dato o pista de por donde seguir

Código Java:
Ver original
  1. public Integer obtenerNumero() {
  2.         EntityManager em = emf.createEntityManager();
  3.         Object obj = null;
  4.        
  5.  
  6.         try {
  7.             Query qry = em.createQuery("SELECT MAX(p.numero) FROM Numero p");
  8.             obj = qry.getSingleResult();
  9.             if (obj == null) {
  10.                 return 0;
  11.             }
  12.             return (Integer) obj;
  13.         } catch (Exception e) {
  14.             System.out.printf(e.getMessage());
  15.         } finally {
  16.              if (em != null) {
  17.                 em.close();
  18.             }
  19.  
  20.        
  21.  
  22.         }
  23.          return (Integer) obj;
  24.     }
  #2 (permalink)  
Antiguo 28/01/2016, 13:30
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 9 años, 8 meses
Puntos: 182
Respuesta: PostrgreSQL no cierra conexiones en JavaEE

Buenas,

No se puede saber con la infomacion aportada, pero me temo que estas obteniendo el entityManager a partir de una transaction JTA global. Puedes indicar de donde obtienes la factoria (emf) o si usas EJB3, JTA, etc?

Un saludo
__________________
If to err is human, then programmers are the most human of us
  #3 (permalink)  
Antiguo 29/01/2016, 06:20
Avatar de Hyemin  
Fecha de Ingreso: agosto-2014
Mensajes: 147
Antigüedad: 9 años, 8 meses
Puntos: 0
Respuesta: PostrgreSQL no cierra conexiones en JavaEE

La factoria la creo en la clase principal

Ahora lo que hice es agregarle emf.close(); en el finally y ya no veo las conexiones colgando.

No se si es la opción mas elegante pero parece servir


Código Java:
Ver original
  1. public class EstadisticaPersistenciaImpl implements EstadisticaPersistenciaControlador {
  2.  
  3. EntityManagerFactory emf = Persistence.createEntityManagerFactory("PersistenceUnit");
  4.  
  5.  
  6. public Integer obtenerNumero() {
  7.         EntityManager em = emf.createEntityManager();
  8.         Object obj = null;
  9.        
  10.  
  11.         try {
  12.             Query qry = em.createQuery("SELECT MAX(p.numero) FROM Numero p");
  13.             obj = qry.getSingleResult();
  14.             if (obj == null) {
  15.                 return 0;
  16.             }
  17.             return (Integer) obj;
  18.         } catch (Exception e) {
  19.             System.out.printf(e.getMessage());
  20.         } finally {
  21.              if (em != null) {
  22.                 em.close();
  23.             }
  24.  
  25.        
  26.  
  27.         }
  28.          return (Integer) obj;
  29.     }
  #4 (permalink)  
Antiguo 29/01/2016, 07:05
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 9 años, 8 meses
Puntos: 182
Respuesta: PostrgreSQL no cierra conexiones en JavaEE

Buenas,

Si como dices en el titulo utilizas Java EE, lo correcto seria que utilices inyeccion de dependencias para no tener que gestionar y cerrar asi tu factory directamente.


Código Java:
Ver original
  1. @PersistenceUnit(unitName="PersistenceUnit")
  2. private EntityManagerFactory emf;

De esta forma sera el propio contenedor el que se encargue de hacer el close y liberar los recursos cuando proceda.

Tambien puedes hacer lo mismo directamente con el entityManager:
Código Java:
Ver original
  1. @PersistenceContext(unitName="PersistenceUnit")
  2. private EntityManager em;

Un saludo
__________________
If to err is human, then programmers are the most human of us
  #5 (permalink)  
Antiguo 29/01/2016, 07:17
Avatar de Hyemin  
Fecha de Ingreso: agosto-2014
Mensajes: 147
Antigüedad: 9 años, 8 meses
Puntos: 0
Respuesta: PostrgreSQL no cierra conexiones en JavaEE

Gracias;

Normalmente usaría CDI, el problema es que estoy trabajando sobre el sistema de otra persona y la empresa usa Tomcat7 que no soporta CDI.

Si no tengo chance de usar CDI es muy "sucio" cerrar el factory? o es la unica solucion posible?
  #6 (permalink)  
Antiguo 29/01/2016, 13:24
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 9 años, 8 meses
Puntos: 182
Respuesta: PostrgreSQL no cierra conexiones en JavaEE

Buenas,

Yo creo que es correcto, pero hay que tener en cuenta que la creacion de la factoria es bastante costosa, por lo que lo mejor seria abrir un factory, despues hacer todas las consultas que tengas que hacer usando entitymanagers y cerrar al final el factory antes de devolver la informacion al usuario.

Si lo quieres mejorar, la mejor manera de hacerlo en un Tomcat seria usar un listener que controle la creacion y cierre del factory como indican aqui, por ejemplo: http://stackoverflow.com/questions/7...managerfactory

Código Java:
Ver original
  1. @WebListener
  2. public class EMF implements ServletContextListener {
  3.  
  4.     private static EntityManagerFactory emf;
  5.  
  6.     @Override
  7.     public void contextInitialized(ServletContextEvent event) {
  8.         emf = Persistence.createEntityManagerFactory("PersistenceUnit");
  9.     }
  10.  
  11.     @Override
  12.     public void contextDestroyed(ServletContextEvent event) {
  13.         emf.close();
  14.     }
  15.  
  16.     public static EntityManager createEntityManager() {
  17.         if (emf == null) {
  18.             throw new IllegalStateException("Context is not initialized yet.");
  19.         }
  20.  
  21.         return emf.createEntityManager();
  22.     }
  23.  
  24. }

Y despues siempre que necesites hacer una consulta:

Código Java:
Ver original
  1. EntityManager em = EMF.createEntityManager();
  2. // ...

Un saludo
__________________
If to err is human, then programmers are the most human of us
  #7 (permalink)  
Antiguo 03/02/2016, 07:25
Avatar de Hyemin  
Fecha de Ingreso: agosto-2014
Mensajes: 147
Antigüedad: 9 años, 8 meses
Puntos: 0
Respuesta: PostrgreSQL no cierra conexiones en JavaEE

Muchas gracias ProfessorFalken

El enlace que envías esta muy bueno :) como siempre, tus aportes son de la mejor calidad

Etiquetas: cierra, conexiones, sql
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 20:28.