# Maximale Anzahl offener Cursor überschritten



## alonzogonzo (2. Sep 2009)

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


```
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);
        } 
    }
  }
```


----------



## velaluka (2. Sep 2009)

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


----------



## thE_29 (2. Sep 2009)

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


```
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...
```


----------



## ARadauer (2. Sep 2009)

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...


----------



## alonzogonzo (4. Sep 2009)

@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


----------

