0

PostgreSQL データベースで JDBC を使用しています。結果セットでエンティティをクエリすると、5 行が返されます。そのエンティティに関連する別のエンティティは、上記の結果セットの行を使用しているときにクエリを実行します。このクエリを実行すると、上記の結果セットが閉じられます。

これは、一度に 1 つの接続で 1 つの結果セットのみをアクティブにできることを意味します。

以前は、同じコードが Oracle DB サーバーに対して完璧に機能していました。

複数の結果セットを許可するようにサーバーを構成するように DB 管理者に依頼する必要がありますか? または、コードに変更を加えるには?それとも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();
4

1 に答える 1

0

その理由は、同じ接続で 2 つの結果セットを使用しているからではなくStatement、新しいクエリに同じオブジェクトを再利用しているためです。Statement インスタンスで executeQuery() を実行すると、以前の結果はすべてクローズされます (あなたのコードが Oracle で動作したことに驚きました...)

2 番目のクエリを実行する前に、新しい Statement オブジェクトを作成するだけです。

ステートメント stmt = conn.createStatement();
Statement nestedStmt = conn.createStatement();

ResultSet lines = stmt.executeQuery("SELECT LINEID,STARTSTOPID,ENDSTOPID FROM LINES"); **//最初の結果セットがアクティブです**

while (lines.next()){
  ...
    ResultSet 停止 = nestedStmt.executeQuery("SELECT STOPID FROM STOPSINLINES WHERE LINEID=" + lineId); **//最初の結果セットが死ぬ**
    List lineStops = new ArrayList();
    while(stops.next()){
        stop stop = StopStorage.getByID(stops.getInt(1));
        lineStops.add(ストップ);
    }
    停止します。閉じる();

    ...
    ResultSet EmergencyLine = nestedStmt.executeQuery("SELECT CAUSE, STARTTIME, ENDTIME FROM EMERGENCYLINES WHERE LINEID =" + lineId);
    if(emergencyLine.next()){
        文字列の原因 = EmergencyLine.getString(1);

    ....
    }
    EmergencyLine.close();

また、すべてのStatement と ResultSetを適切に閉じないようにしてください。

于 2011-01-09T10:54:13.613 に答える