# Resultset schließen ??



## didi577 (23. Jan 2017)

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?

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


----------



## Joose (23. Jan 2017)

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


----------



## thecain (23. Jan 2017)

ResultSet und PreparedStatement sind AutoClosable, ein Try-With-Resource würde den Code vereinfachen und das schliessen unnötig machen.


```
try( PreparedStatement pst = con.prepareStatement(sql);
ResultSet rs = pst.executeQuery()) {
 // dein code
} catch (SQLException e) {
// dein Code
}
```


----------



## Tobse (24. Jan 2017)

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.


----------



## didi577 (24. Jan 2017)

Danke für eure Erklärungen, das hilft mir. Überall kann man Beispielcode finden aber Erklärungen dazu gibts leider selten...


----------



## Times (24. Jan 2017)

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.


----------

