Resultset schließen ??

didi577

Bekanntes Mitglied
Hallo,

ich habe eine Anwendung die fast ausschließlich mit einer MySQL "spricht". Daher öffne ich beim Start und schließe beim Schließen der Anwendung die connection. Das funktioniert gut. Ich habe gelesen dass man Resultsets und Statements schließen soll. Ich habe eine ganze Menge Abfragen und Aktionen. Ich habe jetzt mal bei einer das Resutset und das Statement geschlossen. Kann ich das so machen, oder geht man da anders vor?
Java:
public void boxenLaden(DefaultComboBoxModel boxModel, String sql) {

       ResultSet rs = null;
       try {
           PreparedStatement pst = con.prepareStatement(sql);
           rs = pst.executeQuery();
           while (rs.next()) {
               boxModel.addElement(rs.getString(1));
           }
           rs.close();
           pst.close();
       } catch (SQLException e) {
           StringWriter s = new StringWriter();
           e.printStackTrace(new PrintWriter(s));
           System.out.println(s.toString());
       }
   }
 
Das schließen von Ressourcen sollte im finally-Block passieren. Warum? Auch wenn eine Exception fliegt wird der finally-Block ausgeführt.
Bei deinem jetztigen Code könnte in der Schleife vielleicht ein Fehler sein und eine Exception fliegen. Daraufhin würden ResultSet und PreparedStatement nicht mehr geschlossen werden.

Anmerkung: Bitte achte beim Erstellen deiner Beiträge auf das richtige Unterforum, danke 🙂
 
ResultSet und PreparedStatement sind AutoClosable, ein Try-With-Resource würde den Code vereinfachen und das schliessen unnötig machen.

Java:
try( PreparedStatement pst = con.prepareStatement(sql);
ResultSet rs = pst.executeQuery()) {
 // dein code
} catch (SQLException e) {
// dein Code
}
 
Alle meine Vorredner haben recht. Es ist aber nicht nur guter Stil, sondern hilft auch der Datenbank. Wenn du das ResultSet schließt, weiss die DB, dass du nicht länger an den Daten interessiert bist. Wenn du irgendwann 1000e ResultSets offen hast, kann es sein, dass dir der RAM auf der DB knapp wird.
 
Danke für eure Erklärungen, das hilft mir. Überall kann man Beispielcode finden aber Erklärungen dazu gibts leider selten...
 
Hinzu kommt noch die Sache, das man bei einigen SQL-Servern (u.a. Oracle) nur n viele ResultSets gleichzeitig öffnen kannst. So kann es beispielsweise beim 201. Resultset passieren, das Oracle einen SQL-Error mit "Zu viele Verbindungen offen" wirft.
 

Neue Themen


Zurück
Oben