Ver Mensaje Individual
  #1 (permalink)  
Antiguo 06/08/2010, 04:12
roquecampos
 
Fecha de Ingreso: noviembre-2007
Mensajes: 74
Antigüedad: 14 años, 8 meses
Puntos: 5
Pool de conexiones en aplicación J2SE, Netbeans, Glassfish, etc.

Estimados compañeros:

Estoy dándole vueltas a un asunto, y no termino de encontrar la dirección adecuada, asi que creo que lo mejor es lanzar la pregunta, a ver si alguien me puede orientar.

Tengo una aplicación en dos capas, es decir, la aplicación desarrollada con j2se, que se ejecuta en varias computadoras clientes, y un servidor de bd oracle, al cual la aplicación se conecta y accede a la información que contiene. Para el desarrollo utilizo netbeans 6.9, y el servidor integrado en netbeans Glassfish.

Este es el escenario general. Lo que yo hacía hasta ahora, era abrir una conexión con la base de datos cuando el cliente abre su aplicación, mantenerla abierta durante la vida de la misma, y cerrarla al salir de la aplicación.

Sin embargo me enfrento a una exigencia particular en este caso concreto. La aplicación muestra mucha información que proviene de diferentes consultas sobre la base de datos, al mismo tiempo. Imaginad una pantalla dividida en muchas tablas, cada una de las cuales es una consulta diferente sobre la base de datos, y cada una se actualiza en un instante de tiempo aleatorio, imposible de determinar a priori. Cada tabla es un hilo de ejecución diferente que llegado su momento, vuelve a refrescar la información recuperando un juego de registros de la base de datos.

El problema que tengo es que como solo tengo una conexión con la base de datos para toda la aplicación, si un hilo de ejecución lanza una consulta de bd que tarda 10sg en resolverse, y posteriormente otro hilo de ejecución lanza una consulta que solo tarda 1sg en resolverse, el segundo hilo tiene que esperar a que la conexión esté disponible, asi que la tardanza de la segunda consulta que solo sería de 1 sg, se eleva a 11sg. Esto no funciona demasiado bien, porque cuando un hilo lleva varios segundos esperando a que la conexion quede libre, inevitablemente se le unen otros hilos en la misma situación.

Una estrategia que se me ocurrió es que cada hilo que necesita hacer una consulta, cree una conexión con la base de datos, y la cierre al terminar. Pero ya sabemos que establecer conexiones es costoso en tiempo y penaliza el rendimiento. Además, estamos hablando de una aplicación que tiene corriendo entre 15 y 20 hilos diferentes que realizan una consulta cada, mas o menos, 10 o 20 segundos, con lo cual un solo cliente podría abrir al mismo tiempo 20 conexiones sobre la base de datos. Multipliquemos eso por los diez o quince clientes estimados, y tenemos que en un momento dado se podrían generar hasta más de 300 conexiones a la base de datos, para cerrarlas casi todas unos segundos despues.


Asi que seguí pensando y se me ocurrió implementar un pool de conexiones usando Glassfish. De esta manera Glassfish se encargaría de gestionar el pool, que lo hará mejor que cualquier codigo que pueda programar yo, abrir nuevas conexiones cuando se vayan necesitando, cerrarlas cuando queden libres, y mantener un pequeño numero de conexiones siempre abierto listo para ser usado.

Pero todo lo que encuentro en internet acerca de como usar un pool de conexiones con JDBC, esta enfocado a aplicaciones web, no encuentro ningún ejemplo de como conectarse a un pool desde una aplicación j2se. Lo cual me lleva a pensar si me estaré haciendo un lio, y mezclando tecnologías que no tienen nada que ver.

COmprendo que un pool de conexiones este mas enfocado a una aplicación web que puede tener decenas de miles de usuarios concurrentes, pero, ¿se podria usar tambien desde una aplicación j2se?

Alguna idea y /o comentario?

Muchas gracias de antemano.