¿Cómo utilizar varios conjuntos de resultados con POSTGRES JDBC?

Estoy usando JDBC en una base de datos PostgreSQL. Cuando consulto una entidad en un conjunto de resultados, devuelve 5 filas. Relacionada con esa entidad hay otra entidad, por la que consulto mientras estoy usando una fila en el conjunto de resultados anterior. Cuando ejecuto esta consulta, el conjunto de resultados anterior se cierra.

Esto significa que permite que solo 1 conjunto de resultados esté activo en 1 conexión a la vez.

Anteriormente, el mismo código funcionaba perfectamente para el servidor Oracle DB.

¿Es que necesito pedirle al administrador de la base de datos que configure el servidor para permitir múltiples conjuntos de resultados? ¿O hacer algún cambio en el código? ¿O es imposible hacerlo en postgre? Aquí está el código para más detalles:

    Connection conn = PTSConnection.getConnection();

    Statement stmt = conn.createStatement();

    ResultSet lines = stmt.executeQuery("SELECT LINEID,STARTSTOPID,ENDSTOPID FROM LINES"); **//first resultset is active**

    while (lines.next()){
        int lineId= lines.getInt(1);
        Stop ss = StopStorage.getByID(lines.getInt(2));
        Stop es = StopStorage.getByID(lines.getInt(3));
        ResultSet stops = stmt.executeQuery("SELECT STOPID FROM STOPSINLINES WHERE LINEID=" + lineId); **//first resultset dies**

        List<Stop> lineStops = new ArrayList<Stop>();
        while(stops.next()){
            Stop stop = StopStorage.getByID(stops.getInt(1));
            lineStops.add(stop);
        }
        stops.close();

        Line aLine = null;

        ResultSet emergencyLine = stmt.executeQuery("SELECT CAUSE, STARTTIME, ENDTIME FROM EMERGENCYLINES WHERE LINEID =" + lineId);
        if(emergencyLine.next()){
            String cause = emergencyLine.getString(1);
            Time startTime = emergencyLine.getTime(2);
            Time endTime = emergencyLine.getTime(3);

            aLine = new EmergencyLine(ss, es, cause, startTime, endTime, (Stop[]) lineStops.toArray(new Stop[lineStops.size()]));
        } else {
            aLine = new Line(ss, es, (Stop[]) lineStops.toArray(new Stop[lineStops.size()]));
        }

        emergencyLine.close();

        LineRepository.getInstance().addLine(aLine);
    }

    lines.close();

preguntado el 09 de enero de 11 a las 10:01

1 Respuestas

El motivo no es que esté utilizando dos conjuntos de resultados en la misma conexión, sino que esté reutilizando el mismo Statement objeto para una nueva consulta. Cuando ejecuta executeQuery () en una instancia de Statement, se cerrará cualquier resultado anterior (me sorprende que su código haya funcionado con Oracle ...)

Simplemente cree un nuevo objeto Statement antes de ejecutar la segunda consulta:

Declaración stmt = conn.createStatement (); Declaración nestedStmt = conn.createStatement (); ResultSet lines = stmt.executeQuery ("SELECT LINEID, STARTSTOPID, ENDSTOPID FROM LINES"); ** // el primer conjunto de resultados está activo ** while (lines.next ()) {... ResultSet stops = nestedStmt.executeQuery ("SELECCIONAR STOPID FROM STOPSINLINES WHERE LINEID =" + lineId); ** // el primer conjunto de resultados muere ** List lineStops = new ArrayList (); while (stops.next ()) {Stop stop = StopStorage.getByID (stops.getInt (1)); lineStops.add (detener); } stops.close (); ... ResultSet EmergencyLine = nestedStmt.executeQuery ("SELECCIONAR CAUSA, TIEMPO DE INICIO, TIEMPO FINAL DE LÍNEAS DE EMERGENCIA DONDE LINEID =" + lineId); if (EmergencyLine.next ()) {String cause = EmergencyLine.getString (1); ....} EmergencyLine.close ();

Y no por llegar a cerrar correctamente todas Declaraciones y conjuntos de resultados!

Respondido el 09 de enero de 11 a las 14:01

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.