Frage

Ich bin mit JDBC auf einer PostgreSQL-Datenbank. Als ich für eine Entität in einem resultset abfragen, gibt es 5 Zeilen. Bezug zu dieser Einheit ist ein andere Einheit, für die ich Abfrage, während ich eine Zeile in dem oben resultset verwenden. Wenn ich diese Abfrage ausführen, wird die obige resultset geschlossen.

Das bedeutet, dass es erlaubt nur 1 resultset auf 1 Verbindung zu einem Zeitpunkt aktiv zu sein.

Bisher ist der gleiche Code funktioniert perfekt für Oracle-DB-Server.

Ist es, dass ich die DB-Admin zu bitten, den Server zu konfigurieren, dass mehrere Resultsets zu ermöglichen? Oder eine Änderung im Code zu tun? Oder ist es unmöglich, sie in postgre zu tun? Hier ist der Code für weitere Informationen:

    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();
War es hilfreich?

Lösung

Der Grund ist nicht, dass Sie mit zwei Resultset auf derselben Verbindung, aber Sie sind wieder mit dem gleichen Statement Objekt für eine neue Abfrage. Wenn Sie executeQuery () auf einer Statement-Instanz ausgeführt, wird jedes vorheriges Ergebnis geschlossen werden (Ich bin überrascht, dass Ihr Code Arbeit mit Oracle tat ...)

Erstellen Sie einfach ein neues Statement-Objekt, bevor die zweite Abfrage ausführen:

Statement stmt = conn.createStatement();
Statement nestedStmt = conn.createStatement();

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

while (lines.next()){
  ... 
    ResultSet stops = nestedStmt.executeQuery("SELECT STOPID FROM STOPSINLINES WHERE LINEID=" + lineId); **//first resultset dies**
    List lineStops = new ArrayList();
    while(stops.next()){
        Stop stop = StopStorage.getByID(stops.getInt(1));
        lineStops.add(stop);
    }
    stops.close();

    ...
    ResultSet emergencyLine = nestedStmt.executeQuery("SELECT CAUSE, STARTTIME, ENDTIME FROM EMERGENCYLINES WHERE LINEID =" + lineId);
    if(emergencyLine.next()){
        String cause = emergencyLine.getString(1);

    ....
    }
    emergencyLine.close();

Und nicht für get richtig schließen alle Statements und Result!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top