studyklar
IProg · Skript 9 · Abschnitt 5

JDBC: Ressourcen schließen, auch im Fehlerfall

Was JDBC öffnet, muss man wieder schließen, auch wenn unterwegs ein Fehler passiert. Hier steht, warum, was am einfachen Code falsch ist und wie Java das Schließen übernimmt. Mit Weiter geht es Schritt für Schritt voran. Ein Klick auf einen Schritt springt direkt dorthin.

Worum es geht

Skript 09, Folien 16 bis 19: Fehlerbehandlung, „Ist das korrekt?“, korrekte Fehlerbehandlung, Verwendung von java.lang.AutoCloseable.

Bisher endete jedes Beispiel mit rs.close() und stmt.close(). Das klappt, solange kein Fehler passiert. Die Frage dieses Abschnitts: Wie sorgt man dafür, dass auch nach einem Fehler alles geschlossen wird?

Ein Fehler heißt in Java Exception. Er unterbricht den normalen Ablauf: Java springt aus der Methode heraus, bis ein catch ihn auffängt. Bei JDBC heißt er SQLException.

Aus Skript 09, Folie 8: Ein Statement liest mit executeQuery, das Ergebnis ist ein ResultSet; am Ende werden beide geschlossen.

So gehen wir vor:

  1. Warum offene Objekte schaden.
  2. Was am einfachen Code von Folie 17 falsch ist.
  3. Die Lösung mit finally (Folie 18).
  4. Die kurze Lösung mit try-with-resources (Folie 19).
  5. Eine Klausurfrage dazu.

Offene Objekte belegen die Datenbank

offenes Objektbelegt auf der Datenbank
Connectioneine Verbindung; die Zahl ist begrenzt
StatementSpeicher für den Befehl
ResultSeteinen Cursor: Zeiger in die Ergebnismenge

Connection, Statement und ResultSet sind nicht nur Java-Objekte. Zu jedem gehört etwas auf der Datenbank: eine Verbindung, Speicher für den Befehl, ein Cursor. Ein Cursor ist der Zeiger der Datenbank in eine Ergebnismenge, also das Gegenstück zum ResultSet.

Solange man sie nicht schließt, bleibt das belegt. Die Folie nennt die Folge: zu viele offene Cursor. Dann lehnt die Datenbank weitere Verbindungsversuche ab, und die Web-Anwendung funktioniert für niemanden mehr.

Schließen, auch im Fehlerfall

Skript · Folie 16
  • Instanzen von JDBC-Objekten müssen geschlossen werden. Auch im Fehlerfall!
  • Beim Aufruf von close() können wiederum Fehler entstehen.
  • In Java müssen Fehler (Exceptions) behandelt werden.

Darum gilt: Jedes JDBC-Objekt wird geschlossen, auch wenn vorher ein Fehler passiert ist.

Zwei Dinge machen das mühsam. Auch close() kann eine SQLException werfen. Und Java verlangt, dass man eine SQLException behandelt: mit catch auffangen oder mit throws im Methodenkopf weitergeben.

Noch 10 Schritte bis zum Ergebnis
Den ganzen Lösungsweg sehen Studierende und Lehrende der HS KL. Registriere dich mit deiner Adresse @stud.hs-kl.de oder @hs-kl.de, dann geht es hier direkt weiter.

Abbildung 1

offenes Objektbelegt auf der Datenbank
Connectioneine Verbindung; die Zahl ist begrenzt
StatementSpeicher für den Befehl
ResultSeteinen Cursor: Zeiger in die Ergebnismenge
LegendeZeilen des SchrittsWas jedes offene JDBC-Objekt auf der Datenbank belegt.