Pool de conexiones, ¿dónde instanciarlo?

patrif
15 de Abril del 2005
Hola a todos, estoy con una aplicación web que actualmente abre y cierra una conexión a BD cada vez que es necesario. Quiero modificar esto, porque es muy lento u además genera problemas de memoria en partes de la aplicación que son muy pesadas, por un pool de conexiones, que mejora la eficiencia.

El problema está a la hora de hacer que esté disponible para todas los usuarios que visiten la web.

¿Dónde tiene que instanciarse para que esto sea posible?

Porque, sino se instancia en un servlet o jsp, se creará en ese momento y en cuanto se acabe esa página dejará de estar disponible, ¿no?

Cómo podeis ver, necesito algo de ayuda porque estoy muy perdida con esto.

Gracias a todos y un saludo.

Ken
15 de Abril del 2005
Un pool de conexiones no es una clase que uno instancia y hace disponible...

Se configura en el server.xml, dentro de la definición de un contexto (aunque puede haberlos genéricos). Tú configuras un DataSource para el pool de conexiones de modo que todo aquel que quiera, puede sacar una conexión del pool y usarla.

El proceso es el siguiente:

El contenedor (Tomcat o el que sea) configura el pool de conexiones al vuelo al arrancar el contexto. Supongamos que lo hemos definido para 30 conexiones... pues esas 30 conexiones están ya "en el aire" para que si alguien quiere conexión a la Base de Datos, se la pida al Pool y él le de la que sea de esas 30.

Cuando el cliente ha acabado con la conexión (se termina de procesar la petición del servlet, por ejemplo) cuando el cliente (que en este caso, recordemos, es el propio servlet el que es cliente del Pool) haría "conexion.close()".
Este método es distinto para una conexión de pool (PoolableConnection) ya que en lugar de cerrarla, lo que hace es enviarla de vuelta al pool para su reutilización.

El DataSource del Pool y cómo pedirle la conexión se suele implementar con JNDI. Hay un capítulo dedicado a esto en la documentación de Tomcat, pero lo puedes mirar porque es común a casi todos los contenedores.

ADVERTENCIA: Usando conexiones de Pool corres el riesgo de dejarte conexiones abiertas. Hay parámetros que fuerzas las conexiones abandonadas a volver al pool, pero como siempre, lo mejor es ir con cuidado. Recomendaciones: Cierra SIEMPRE los ResultSets, los Statements y los Connection que uses. SIEMPRE...

Un saludo, ya nos contarás...

Ken