Java - Manejo de Pool Java SE

 
Vista:
Imágen de perfil de Franklin
Val: 456
Bronce
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Manejo de Pool Java SE

Publicado por Franklin (179 intervenciones) el 20/05/2020 00:29:19
Chicos Buenas tardes, el día de hoy vengo con una cosa que no le encuentro sentido / solución.

Actualmente desarrollo un pequeño sistema para la oficina donde trabajo, este sistema cuenta con un Pool con dbcp2 configurado así:

1
2
3
4
5
6
7
8
9
10
11
BasicDataSource ds = new BasicDataSource();
 
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUsername(user);
ds.setPassword(pass);
ds.setUrl(url);
ds.setInitialSize(1);
ds.setMaxTotal(10);
ds.setTestWhileIdle(true);
ds.setTimeBetweenEvictionRunsMillis(10000);
ds.setValidationQuery("select 1");

y Cada vez que necesito hacer una consulta utilizo:

1
2
try (Connection con = clase.getDS.getCon() ){
// Para cerrar la conexión una vez terminada la consulta


hasta aquí no tengo problemas es solo un poco de contexto.


el problema viene pues al logearme (pasar la verificación de user/pass del sistema) se crean 3 conexiones las cuales no se cierran. He revisado el código y todos los metodos se estructuran de la misma manera.

1
try (Connection con = clase.getDS.getCon() ){

Sé que son 3 porque he ido aumentando la cantidad de máximas conexiones por ordenador y queda siempre en 3.

Sé que cada vez que cierro mi variable Connection se vuelve al pool y este libera un cupo.


Sucede también que, una vez hecho el loggin se ejecutan múltiples hilos en simultáneos que obtienen diferentes estadísticas, puede ser que al ejecutarse todos al mismo tiempo el pool habilite estos 3 espacios ya que los requiere al mismo tiempo y luego queden abiertos pero disponibles ?

he Probado imprimir el nombre de la clase y el nombre del método cada vez que es llamado para hacer seguimiento de ello, a su vez imprimo la cantidad de conexiones en simultaneo que hay en ese momento.

y tras ejecutar todas estas búsquedas para mis estadísticas; al imprimir las conexiones activas me devuelve 0.


Quizás no me supe explicar con total claridad pero, es posible que al iniciar se requieran 3 conexiones del pool para manejar los diferentes hilos y al terminar todas estas 3 conexiones al pool quedan abiertas aunque solo se reutilice 1?, pregunta: ¿como cerraría las excedentes y mantenerme con solo 1.?

nota: he intentado colocar max 1 pero el sistema se queda colgado mientras que los hilos esperan se libere una entrada al pool.

nota2: he intentado cerrar las conexiones cada 10 segundos pero el pool mantiene estas 3 activas pero no conectadas.

Actualizo: estuve revisando un rato la red y vi que se puede implementar un servidor de conexiones pero si no me equivoco opciones como tomcat y glassfish están disponibles para Java EE y no SE


si estoy haciendo de una mala práctica agradezco la recomendación.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Manejo de Pool Java SE

Publicado por Costero (144 intervenciones) el 21/05/2020 05:15:11
Lo primero que hay que preguntarse, es para que/o por que utilizar conexion pool.

La base de data conexion pool se utiliza, que yo sepa por dos cosas: Performance y controlar el numero de conexiones contra la base de dato.

Performance: Establecer una conexion a la base de data en Java es lento, puede tomar unos cuantos segundos. No parece mucho pero cuando tiene que estar creando y terminando conexiones affecta el performance.

Controlar el numero de conexiones: Las bases de datos permiten una cierta cantidad de conexiones. Si pasan ese limite o cerca del limite la DB empieza a tener performance o crash.

Por ejemplo en tu configuration tu le decis que tenga un maximo de 10 conexiones.

Las conexiones se quedan abierta, por lo que explique arriba. Cuando hagan estan ahi para trabajar, no hay que crear una nueva conexion. Claro puedes configurar cuando conexiones dejar abierta cuando elapse cierto tiempo.

Yo considero Tomcat as SE. Puedes setear dbcp in tomcat.

Existe TomcatEE que implementa completamente Java EE
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Franklin
Val: 456
Bronce
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Manejo de Pool Java SE

Publicado por Franklin (179 intervenciones) el 21/05/2020 14:20:38
Inicialmente implemente el pool porque los usuarios que usan el sistema algunos están situados en diferentes sedes, entonces tener que abrir y cerrar cada conexión genera cierto delay. Estuve unos días revisando para implementar un servidor de conexiones pero solo llegue a ver disponibilidad para J, EE

En primera instancia la implementación del pool no me daba problemas, puesto que usaba solo 1 conexión por usuario que es lo único que necesita pero se mantiene abierta mientras use el sistema para evitar abrir y cerrar, pero hace poco implementé en el Index o Main Frame una seríe de estadísticas y gráficos.

Al tener un hilo para cada uno todos empiezan a la vez para evitar el tiempo de carga de primera vez, pero significa que al iniciar usa 3 conexiones en simultaneo y ya luego quedan abiertas.

Si es cierto que luego no investigué referente a un servidor de conexiones porque aparentemente todo decia que solo se implementaba en java EE
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Franklin
Val: 456
Bronce
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Manejo de Pool Java SE

Publicado por Franklin (179 intervenciones) el 21/05/2020 19:00:57
Costero te comento, llegue a solucionar el inconveniente.
El problema era que al tener unos cuantos hilos que iniciaban en simultaneo estos solicitaban una conexión al pool por lo que aperturaba 3 conexiones como tope, luego estos regresaban al pool,

Evite usar Hilos y las estadísticas se calculan solo cuando se presiona en su opcion.


Gracias por tu comentario, aunque la verdad no consigo aun como implementar Tomcat con Java SE, quizás no estoy buscando bien o la respuesta es mas simple de lo que parece (al menos para mi).

En cualquier caso gracias por comentar
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar