# ResultSet schließen?



## theomega (1. Dez 2007)

Hallo Leute,
ich habe eine ziemlich große Java-Webanwendung geschrieben, allerdings ohne ein ORM-Framwork, ich mach die Queries selbst.

Meine Vorgehensweise ist folgende:
Für jedes Request hole ich eine Verbindung aus dem Tomcat-Connectionpool und benutze diese für das Request. Am Ende des Requests schließe ich die Verbindung wieder (damit kommt sie dann zurück in den Pool).

Die Frage ist jetzt:
Muss man die ResultsSets die ich unterwegs erstelle noch schließen (mit .close()) oder reicht es einfach ganz zum schluss den Garbagecollector kommen zu lassen und nur die Verbindung zu schließen?

Falls ich jedes RS schließen muss, gibt es dann eine Anwendung die mir hilft alle RS's rauszufinden die ich nicht explizit schließe?

Danke
TO


----------



## maki (1. Dez 2007)

Du solltest auf jeden Fall die Die Statements und die Resultsets schliessen, insbesondere wenn du einen Pool verwendest.
Verschiedene Pool Implementierungen werden das unterschiedlich handhaben, ob die Implementierung die du verwendest die Statements und Resultsets selbst schliesst, steht in der Doku.

Reihenfolge:
1. Connection öffnen (macht bei dir der Pool)
2. Statement erzeugen
3. Resultset erzeugen
...
4. Resultset schliessen
5. Statement schliessen
6 Connection schliessen (gibt bei dir die Connection an den Pool zurück)


----------



## tfa (1. Dez 2007)

Schließt Du wenigstens die Statements? Ein Statement, das geschlossen wird, stellt sicher, dass ein eventuell vorhandenes ResultSet ebenfalls geschlossen wird.


----------



## Guest (1. Dez 2007)

Hier eine Vorlage (den Code im finally-Block kannst du in eine Hilfsklasse auslagern)
	
	
	
	





```
Connection connection = null;
PreparedStatement statement = null;
try
{
   connection = ...
   statement = connection.prepareStatement(sqlStatement);
   ...
   ResultSet resultSet = ...
   ...
   resultSet.close();
}
catch(SQLException e)
{
   ... Logging, Fehlerbehandlung
}
finally
{
   if(statement != null)
   {
      try
      {
         statement.close();
      }
      catch(SQLException e)
      {
         // Fehler loggen
      }
   }
   if(connection != null)
   {
      try
      {
         connection.close();
      }
      catch(SQLException e)
      {
         // Fehler loggen
      }
   }
}
```


----------



## theomega (1. Dez 2007)

Hy,
danke an alle, nur hatte ich mich nicht ganz klar ausgedrückt:
Das ich das Statement und das Resultset schließen SOLLTE ist mir klar, nur wie steht es mit dem MÜSSEN?

Zu Deutsch: Wenn ich folgenden Code habe (nur Schema)


```
Connection con = (aus dem Pool hoolen)
try {
handle_request(con);
finally {
con.close();
}

public void handleRequest(Connection con) {
ResultSet rs = con....

... irgendwas mit dem rs tun ...
}
```

Dann ist ja nach jedem Request das ResultSet nichtmehr existent und der Garbagecollector kann es aufräumen. 
Kann ich mir es sparen die ResultSets zu schließen weil in absehbarer Zeit eh der Garbagecollector vorbeikommt und beim Destroy auch die ResultSets geschlossen werden?

Versteht jemand was ich meine?

DAnke
TO


----------



## Guest (1. Dez 2007)

ResultSets brauchst du nicht zu schliessen, wenn du das dazugehörige Statement schliesst.

Kommentar in ResultSet





> A ResultSet object is automatically closed when the Statement object that generated it is closed,
> re-executed, or used to retrieve the next result from a sequence of multiple results.


Kommentar in Statement#close()





> Releases this Statement object's database and JDBC resources immediately instead of waiting for
> this to happen when it is automatically closed. It is generally good practice to release resources
> as soon as you are finished with them to avoid tying up database resources


----------



## Guest (1. Dez 2007)

Übrigens, insbesondere der letzte Satz sagt alles


> It is generally good practice to release resources as soon as you are finished with them to avoid tying up database resources


----------

