2011-01-09 17 views
0

私はPostgreSQLデータベースでJDBCを使用しています。 結果セット内のエンティティをクエリすると、5行が返されます。 そのエンティティに関連するもう1つのエンティティですが、私は上記の結果セットで行を使用している間にクエリを実行します。 このクエリを実行すると、上記の結果セットは閉じられます。POSTGRES JDBCで複数の結果セットを使用するには?

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

以前は同じコードがOracle DBサーバーに最適でした。

DB管理者に複数の結果セットを許可するようにサーバーを設定する必要がありますか? コードを変更するには? ポストグレイではできないのですか?ここで は、詳細のコードです:

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

答えて

0

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

2番目のクエリを実行する前に新しい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(); 

そしてに適切に近いすべての文とResultSetを得ることはありませんのために!

関連する問題