Nuevamente me encuentro con esta situación, así que mejor la coloco como un post en el blog para tenerla luego como referencia y haber si a alguien más le sirve.
Cuando se está iterando un ResultSet en java como resultado de una consulta hacia MySql (jdbc) es muy común querer extraer más datos por cada iteración, es decir ejecutar una nueva consulta dentro del while que está iterando y recibir una excepción del tipo:
java.sql.SQLException: Operation not allowed after ResultSet closed
La misma que puede ser generada con un código parecido a este:
Statement st_A = conexion.createStatement();
ResultSet rs_A = st_A.executeQuery("cualquierConsulta");
while(rs_A.next()){
ResultSet rs_B = st_A.executeQuery("otraConsulta");
}
El origen es muy simple, cada vez que se realiza la ejecución de una sentencia en el ‘Statement’ todos los ‘ResultSet’ asociados a este son cerrados por lo que iterarlos ya no es posible (el programa anterior fallará luego de la primer iteración).
Una solución que encontré a esto es crear ‘Statement’ separados por cada uno de los ‘ResultSet’ de la siguiente forma:
Statement st_A = conexion.createStatement();
ResultSet rs_A = st_A.executeQuery("cualquierConsulta");
while(rs_A.next()){
Statement st_B = conexion.createStatement();
ResultSet rs_B = st_B.executeQuery("otraConsulta");
}
Saludos.
agosto 28, 2011 a las 9:36 pm
[…] https://qmarqeva.wordpress.com/2011/08/25/resultset-closed-mysql-java/ August 29, 2011 // MySQL // No Comments // […]
septiembre 10, 2011 a las 12:48 pm
La verdad si funciona tu solucion pero el que paga los platos rotos es el rendimiento ya que el acceso a la DB se incrementa exponencialmente y eso en produccion te puede costar un servidor jejeje… Pero de que funciona funciona!!!
septiembre 10, 2011 a las 5:34 pm
@Luis. En realidad lo que se sacrifica con esta solución es memoria, por la existencia de dos ResulSets diferentes 😉 … y para producción en sistemas de gran cantidad de datos existe la persistencia, esta solo es para esos casos que nunca faltan por ahí jeje
julio 27, 2012 a las 8:08 am
Gracias el ejemplo muy bien explicado me ayudo mucho muchas gracias
SALUDOS!!
noviembre 23, 2012 a las 10:05 am
Muy buen aporte. «el que paga los platos rotos es el rendimiento ya que el acceso a la DB se incrementa exponencialmente» No es tan así, porque si uno va a realizar muchas consultas, puede simplemente implementar una clase Singleton que provea ambos Statement, y que ambos se cierren recién cuando se cierra la aplicación.
Saludos,
diciembre 5, 2012 a las 6:37 pm
gracias hermano me haz salvado la vida
enero 27, 2013 a las 1:33 pm
Gracias hermano, me quite esa Exception que me lanzaba el programa con tu idea. buen dia.
junio 18, 2016 a las 2:33 am
muchas gracias con eso me soluciono un gran problema
septiembre 19, 2016 a las 5:44 pm
me ha servido amigo gracias