Pool Conexiones DBCP

Buenas,
Soy nueva en el foro, pero les pido que me ayuden!!, Hace unos añitos ya, realice una aplicación pero resulta que comenzó a fallar por el número de conexiones, así que decidí usar el pool de conexiones dbcp, la clase compila bien pero al momento de correr mi programa en el tomcat 6, estoy programando en jsp,no me genera error pero no me muestra la consulta, yo tenía una clase de conexión anterior que no usaba pool pero me funcionaba y consultaba correctamente, no se que este haciendo mal, esta es la clase:

 
Gracias!

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de DianitaYPP

Solucioné una parte

De nuevo yo, hice una modificación al código, y en la parte donde mando a imprimir el resultset me muestra los datos de la consulta, es decir, que si se llena y si se conecta a la base de datos, pero, en el index1.jsp no se muestra nada, es decir, desde la aplicación si envía el select que necesitó, en la clase si se llena el rs, pero debería mostrar en el y no muestra nada, que podrá ser???
---------------------------------------------------------------------------------
Lo que adicione al código:
 
----------------------------------
Alguna idea de que podrá hacer??? Porfaaa ayudaaa!!!!!!

Imagen de luxspes

Haz oido de las etiquetas

Haz oido de las etiquetas code? Si las usas sera mas facil que la gente entienda tu pregunta y te pueda ayudar...

Imagen de DianitaYPP

Gracias

Lo siento, gracias, ya lo edite :)

Imagen de ezamudio

consulta

El ResultSet que devuelves ya no sirve para nada, porque ya cerraste la conexión de donde viene.

Pero... como es un pool, la conexión realmente no se cierra, sino que regresa al pool, pero no sé si haya alguna advertencia en el log de que estás dejando cosas abiertas (en este caso, el ResultSet y el Statement).

En general está mal tu patrón de uso del ResultSet; no deberías estar devolviendo ResultSets así. Los ResultSets necesitan que la conexión de donde vienen esté abierta para poder usarlos, y al final hay que cerrar el ResultSet, el Statement que lo creó y finalmente la conexión. Tu método de liberar conexión está mal porque solamente cierra la conexión, pero el método de insertar por ejemplo tampoco cierra el statement.

Imagen de DianitaYPP

This ResultSet is closed.

Hola! Gracias por responder, efectivamente estaba leyendo el log del tomcat y sale el mensaje sobre el ResultSet, te comentó, es que el método consultar debe retornar el ResultSet, pero no sé como aparte de retornarlo, liberar la conexión, me podrías explicar? :( es la primera vez que uso dbcp...intente incluso, utilizar un set y un get para llenar una copia del ResultSet cuando se llena, y poderlo recuperar, pero tampoco funciona :(

 

Imagen de ezamudio

no se puede

La respuesta corta: no se puede. Si devuelves un ResultSet, es porque dejas la conexión abierta. Pero tienes que tener mucho cuidado con el manejo de los recursos en ese caso. Quien haya obtenido el ResultSet debe cerrar la conexión y cualquier otro recurso abierto al final. La definición de "al final" es lo crucial aquí.

Si es una app web, una opción es implementar el patrón open session in view, o bien NO devolver un ResultSet sino los resultados que contiene, en forma de una lista de mapas o de objetos de alguna clase (pero eso ya se acerca peligrosamente a hacer tu propio ORM). Para ambas opciones existen bibliotecas y/o frameworks que ya implementan eso para que no lo tengas que hacer a patín, por ejemplo el JdbcTemplate de Spring.

Imagen de DianitaYPP

:(

Estaba pensando en guardar los datos del ResultSet en una lista y retornar la lista... y así poder cerrar la conexion, el statement y el resultset...voy a leer sobre JdbcTemplate, gracias por responder!

Imagen de apolonioluis

yo uso yank jdbc es muy

yo uso yank jdbc es muy ligero y facil de usar, es una alternativa ligth a hibernate.

Imagen de Gallosuarez

Por si aún te sirve ...

DianitaYPP:

Ignoro si ya pudiste solucionar tu problema, sin embargo, te dejo una liga donde puedes revisar algunos ejemplos en el uso correcto de commons-dbcp.

Saludos,
Gerardo Suárez Trejo

Imagen de DianitaYPP

Si Gracias, los había tomado

Si Gracias, los había tomado de ejemplos..pero no me sirve porque no me permite retornar el resultset.

Imagen de DianitaYPP

Hola, disculpa, he estado

He estado leyendo acerca de JdbcTemplate, sea la solución que escoja igual debo modificar mis jsp´s pues solo puedo lograr que retorne un list y no un resultset, así que modifico mi pregunta: cuál es la manera más eficiente de manejar mis conexiones pool? usando JdbcTemplate o el Dbcp, es decir, si tuvieran las dos opciones, cuál escogerían? Ya que el cambio se me volvió engorroso, quiero estar segura de escoger la mejor opción, :( consejos?....y de antemano, gracias a todos por sus respuestas!!!

Imagen de neko069

Correcciones mencionadas

Pues lo del   como te dicen que lo uses, es llenar una lista de objetos (tienes/puedes crear uno) algo así se me ocurre:

 

Luego, la forma en cómo ciclas el   sería más o menos así (tomando tu método original):

 

En tu otra clase ( ) y en tu jsp ( ) Ya tendrías que modificar acorde. El código es puramente de muestra y me lo hice al vuelo, así que puede tener fallas, checa qué te sirve, y ya que funcione como quiere, postea tú código para la posteridad del foro ;-)

Imagen de DianitaYPP

Gracias neko069, que tonta no

Gracias neko069, que tonta no había pensado en eso, que me aconsejas tú?, seguir usando dbcp o implementar JdbcTemplate? En cuanto a rendimiento y demás características, cuál es mejor?

Imagen de ezamudio

nada que ver

Dbcp y JdbcTemplate son dos cosas completamente separadas, no tienen nada que ver una con la otra, hacen cosas distintas y usar una no implica que no uses la otra. Dbcp es un pool de conexiones a base de datos implementado como un DataSource. JdbcTemplate es un componente que usa un DataSource para interactuar con una base de datos sin tener que estar peleándose con conexiones; sus métodos obtienen una conexión y siempre la cierran al final y si ocurre una excepción la traducen a tiempo de ejecución.

Imagen de DianitaYPP

Me queda claro :) Mil gracias

Me queda claro :) Mil gracias

Imagen de DianitaYPP

Solucionado

Clase Base Datos

 

----Clase Usuario--------
 

------Paciente.java-----
 

----index1.jsp------

 

La solución sugerida por Neko069 funcionando :) Gracias!!

Imagen de DianitaYPP

JdbcTemplate

En esta página explican con un ejemplo el JdbcTemplate, estaré probando de esta otra manera:

Ejemplo

Imagen de ezamudio

BaseDatos

Tu clase BaseDatos sigue estando mal, sólo cierras la conexión (y el statement y demás) si todo sale bien; si se arroja una excepción no haces nada (sólo la imprimes, pero se queda abierta la conexión). El método liberaConexion lo debes invocar en el finally, no al final del try.

Imagen de neko069

Ejem...

Gracias por publicar tu respuesta, algunos detalles:
- Abres conexión ( ), sentencia ( ) y resultados( ) y los cierras en el mismo orden ... NO; para cerrar el orden es  ,   y  .
-Para crear tu connection pool, yo encontré otros ejemplos que son de las docs de commons dbcp, acá, acá y acá, son alternativas a tu configuración, igual puedes checar los ejemplos, y a tu criterio (y tiempo) ver si hay alguna ventaja en hacerlo como se ilustra.

Para lo de Spring, antes de que eches mano de cualquier tutorial en blogs, mejor busca en la documentación, por decir algo, en las docs de la versión 3.2échale una leída al apartado de... bueno, lee todo (si no conoces Spring, comienza desde el apartado III Core Technologies y luego te regresas a leer lo primero), pero en la Parte 4, apartado 14 (parece código penal) está lo referente a jdbcTemplate, aunque te repito, todo es importante, y para un ejemplo completo, bájate el Pet clinic y juega con el código.

Edito: Haz caso a las sugerencias de Enrique, él sabe de lo que habla.

Imagen de DianitaYPP

Gracias por corregir, sería

Gracias por corregir, sería así?
 

Imagen de ezamudio

Se ve bien, eso debería cerrar la conexión incluso si hay problemas. Aunque no entiendo por qué   no es una variable local; no debe ser un campo porque entonces vas a tener muchos problemas cuando varios hilos usen el mismo objeto.

Si estás en Java 7, tal vez puedes usar el try-with-resources. Ejemplos aquí.

 

Imagen de DianitaYPP

Gracias Ezamudio!!! Me haz

Gracias Ezamudio!!! Me haz ayudado muchisimo!!!! cambiaré conexión a variable a local...