Saltar al contenido

¿Cómo puedo evitar que ResultSet sea una excepción cerrada en Java?

Después de tanto luchar pudimos encontrar la solución de esta impedimento que ciertos usuarios de este espacio han tenido. Si quieres compartir alguna información no dudes en compartir tu comentario.

Solución:

Parece que ejecutó otra instrucción en la misma conexión antes de recorrer el conjunto de resultados de la primera instrucción. Si está anidando el procesamiento de dos conjuntos de resultados de la misma base de datos, está haciendo algo mal. La combinación de esos conjuntos debe realizarse en el lado de la base de datos.

Esto podría deberse a varias razones, incluido el controlador que está utilizando.

a) Algunos controladores no permiten declaraciones anidadas. Dependiendo de si su controlador es compatible con JDBC 3.0, debe verificar el tercer parámetro al crear el objeto Statement. Por ejemplo, tuve el mismo problema con el controlador JayBird para Firebird, pero el código funcionó bien con el controlador postgres. Luego agregué el tercer parámetro a la llamada al método createStatement y lo configuré en ResultSet.HOLD_CURSORS_OVER_COMMIT, y el código también comenzó a funcionar bien para Firebird.

static void testNestedRS() throws SQLException 

    Connection con =null;
    try 
        // GET A CONNECTION
        con = ConexionDesdeArchivo.obtenerConexion("examen-dest");
        String sql1 = "select * from reportes_clasificacion";

        Statement st1 = con.createStatement(
                ResultSet.TYPE_SCROLL_INSENSITIVE,
                ResultSet.CONCUR_READ_ONLY, 
                ResultSet.HOLD_CURSORS_OVER_COMMIT);
        ResultSet rs1 = null;

        try 
            // EXECUTE THE FIRST QRY
            rs1 = st1.executeQuery(sql1);

            while (rs1.next()) 
                // THIS LINE WILL BE PRINTED JUST ONCE ON
                                    // SOME DRIVERS UNLESS YOU CREATE THE STATEMENT 
                // WITH 3 PARAMETERS USING 
                                    // ResultSet.HOLD_CURSORS_OVER_COMMIT
                System.out.println("ST1 Row #: " + rs1.getRow());

                String sql2 = "select * from reportes";
                Statement st2 = con.createStatement(
                        ResultSet.TYPE_SCROLL_INSENSITIVE,
                        ResultSet.CONCUR_READ_ONLY);

                // EXECUTE THE SECOND QRY.  THIS CLOSES THE FIRST 
                // ResultSet ON SOME DRIVERS WITHOUT USING 
                                    // ResultSet.HOLD_CURSORS_OVER_COMMIT

                st2.executeQuery(sql2);

                st2.close();
            
         catch (SQLException e) 
            e.printStackTrace();
         finally 
            rs1.close();
            st1.close();
        

     catch (SQLException e) 

     finally 
        con.close();

    


b) Podría haber un error en su código. Recuerde que no puede reutilizar el objeto de declaración, una vez que vuelva a ejecutar una consulta en el mismo objeto de declaración, todos los conjuntos de resultados abiertos asociados con la declaración se cerrarán. Asegúrese de no cerrar la declaración.

Además, solo puede tener abierto un conjunto de resultados de cada declaración. Entonces, si está iterando a través de dos conjuntos de resultados al mismo tiempo, asegúrese de que se ejecuten en declaraciones diferentes. Abrir un segundo conjunto de resultados en una declaración cerrará implícitamente el primero. http://java.sun.com/javase/6/docs/api/java/sql/Statement.html

Te mostramos comentarios y valoraciones

Si sostienes alguna desconfianza y forma de enriquecer nuestro sección eres capaz de realizar una acotación y con mucho gusto lo observaremos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *