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!
- Inicie sesión o regístrese para enviar comentarios
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!!!!!!
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...
Gracias
Lo siento, gracias, ya lo edite :)
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.
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 :(
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.
:(
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!
yo uso yank jdbc es muy
yo uso yank jdbc es muy ligero y facil de usar, es una alternativa ligth a hibernate.
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
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.
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!!!
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 ;-)
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?
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.
Me queda claro :) Mil gracias
Me queda claro :) Mil gracias
Solucionado
Clase Base Datos
----Clase Usuario--------
------Paciente.java-----
----index1.jsp------
La solución sugerida por Neko069 funcionando :) Gracias!!
JdbcTemplate
En esta página explican con un ejemplo el JdbcTemplate, estaré probando de esta otra manera:
Ejemplo
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.
Ejem...
Gracias por publicar tu respuesta, algunos detalles:
), sentencia (
) y resultados(
) y los cierras en el mismo orden ... NO; para cerrar el orden es
,
y
.
- Abres conexión (
-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.
Gracias por corregir, sería
Gracias por corregir, sería así?
Sí
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í.
Gracias Ezamudio!!! Me haz
Gracias Ezamudio!!! Me haz ayudado muchisimo!!!! cambiaré conexión a variable a local...