ResultSet closed – mysql – java

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.

9 respuestas to “ResultSet closed – mysql – java”

  1. Luis Says:

    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!!!

    • qmarqeva Says:

      @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

  2. oscar Says:

    Gracias el ejemplo muy bien explicado me ayudo mucho muchas gracias
    SALUDOS!!

  3. Charles Says:

    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,

  4. marco Says:

    gracias hermano me haz salvado la vida

  5. bernardo Says:

    Gracias hermano, me quite esa Exception que me lanzaba el programa con tu idea. buen dia.

  6. fernando Says:

    muchas gracias con eso me soluciono un gran problema

  7. Darwin Narváez Says:

    me ha servido amigo gracias


Deja un comentario