Maximale Anzahl offener Cursor überschritten

Status
Nicht offen für weitere Antworten.

alonzogonzo

Mitglied
Hallo zusammen

Ich versuche eine DB mit einigen tausend Datensätzen zu füllen, die ich über einen Prozess zeilenweise verarbeite.

Nach einiger Zeit taucht die allseits bekannte "Maximale Anzahl offener Cursor überschritten" Fehlermeldung auf.

Ich frage mich nun was ich dagegen tun kann. Meines Wissens schliesse ich sowohl das Statement als auch das ResultSet aber das scheint nichts zu bringen und die max. Anzahl Cursor habe ich auf der DB bereits auf 2000 hochgeschraubt.

Könnt ihr mir sagen was ich noch tun kann oder was allenfalls an meinem Code falsch ist?

Danke für jeden Tipp.
Grüsse Phil

SQL:
  public void insertPortbelegungEintrag(String macAdresse,int portId,int switchId) throws Exception  {
      String sqlPortbelegungEintragNextId = "select portbelegungId.nextval from dual";
      String sqlSpeichernPortbelegungEintrag = "insert into port_temp values(?,?,?,?,?)";
      ResultSet result = null;
      PreparedStatement prepStmt = null;
      Connection con = null;
      Date datum = new Date();
      SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy");
      
      try {
          con = getConnection();
          prepStmt = con.prepareStatement(sqlPortbelegungEintragNextId);
          result = prepStmt.executeQuery();
          result.next();
          int portbelegungId = result.getInt(1);
          if(!result.next()) {
              prepStmt = con.prepareStatement(sqlSpeichernPortbelegungEintrag);
              prepStmt.setInt(1,portbelegungId);
              prepStmt.setString(2,macAdresse);
              prepStmt.setInt(3,portId);
              prepStmt.setString(4,df.format(datum));
              prepStmt.setInt(5,switchId);
              prepStmt.execute();
              prepStmt.close();
              result.close();
          }             
      } catch (Exception e) {
          System.out.println("Fehler: " + e);
      }
    finally {
        String message = ""; 
        result.close();
        try {
            if (prepStmt != null)
                prepStmt.close();
        }  catch (SQLException e) {
            message += " - Fehler beim Schliessen des Statement: "
        + e.getMessage();
        }
        releaseConnection();
        if (message.length() > 0) {
            throw new Exception(message);
        } 
    }
  }
 
Hallo,
könnte es reichen wenn du zeile 24 und 25 tauscht. Du schließt erst das PStatement und nicht erst das RS.....
Ciao velaluka
 
Desweiteren (wenn du Oracle nutzt), hilft dir ein rs.close NICHTS!!!! (könnte bei anderen DBs auch sein).

Man muss alle ResultSet´s abarbeiten! Dh, man macht sich einmal wo ne statische Methode welche sowas macht

Java:
public static void close(ResultSet rs)
{
  try{
     if(rs != null) //loopt es bis zum ende
       while(rs.next());
   }catch(Exception ex){}
  try{
      rs.close();
   }catch(Exception ex){}
}[/Java]

Man sollte als bei select Befehlen wo man nur die erste Zeile abfragt, kein Abfragen machen wo riesige Datenmengen kommen können...
 
du überschreibst dir in zeile 17 prepStmt aus zeile 12.
Wenn du nun ein close auf prepStmt machst schließt du das Stament aus Zeile 17, das aus Zeile 12 müsste noch immer offen sein... weiß nicht ob das was damit zu tun hast aber das könnest du mal schließen.. vielleicht hilfts...
 
@velaluka
Das tauschen der Zeilen hat nichts gebracht. Es scheint so als ob es keine Rolle spielt was zuerst geschlossen wird.

@ARadauer
Dein Tipp brachte die Lösung. Hab gar nicht daran gedacht, das erste Statement zu schliessen. Seit ich dieses direkt nach dem Ausführen schliesse, hat Oracle keine Probleme mehr mit den Cursors.

@thE_29
Den Hinweis werde ich beherzigen und das Schliessen in eine statische Methode bauen.

Danke euch für eure Hilfe.

Grüsse
Phil
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben