Как использовать несколько наборов результатов с POSTGRES JDBC? - PullRequest
0 голосов
/ 09 января 2011

Я использую JDBC для базы данных PostgreSQL.Когда я запрашиваю сущность в наборе результатов, она возвращает 5 строк.С этим объектом связан еще один объект, к которому я обращаюсь, пока использую строку в приведенном выше наборе результатов.Когда я выполняю этот запрос, вышеуказанный набор результатов закрывается.

Это означает, что он позволяет активировать только 1 набор результатов для одного подключения за раз.

Ранее тот же код работал идеальнодля сервера БД Oracle.

Это то, что мне нужно попросить администратора БД настроить сервер для разрешения нескольких наборов результатов?Или сделать некоторые изменения в коде?Или это невозможно сделать в postgre?Вот код для более подробной информации:

    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();

1 Ответ

0 голосов
/ 09 января 2011

Причина не в том, что вы используете два набора результатов в одном соединении, а в том, что вы повторно используете один и тот же объект Statement для нового запроса. Когда вы запускаете executeQuery () для экземпляра Statement, все предыдущие результаты будут закрыты (я удивлен, что ваш код работал с Oracle ...)

Просто создайте новый объект Statement перед выполнением второго запроса:

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();

И не для того, чтобы правильно закрыть все Заявления и ResultSets!

...