Wie bereinigen Sie JDBC-Ressourcen in Java ordnungsgemäß?

8

Was gilt als Best Practices beim Bereinigen von JDBC-Ressourcen und warum? Ich habe das Beispiel kurz gehalten, also nur das Aufräumen des ResultSet.

%Vor%

versus

%Vor%

Persönlich bevorzuge ich die zweite Option, da sie etwas kürzer ist. Irgendwelche Eingaben dazu werden sehr geschätzt.

    
Alexander Rosemann 22.12.2010, 10:22
quelle

9 Antworten

9

Heutzutage bietet JDK 7 die einfachste Möglichkeit, Ressourcen zu bereinigen:

%Vor%

Die Anweisung try stellt sicher, dass jede Ressource am Ende der Anweisung geschlossen ist. Siehe Ссылка

    
André 08.02.2012 19:27
quelle
4

Wie andere bereits erwähnt haben, sind JDBC-Ressourcen (Anweisungen, Ergebnismengen usw.) selten null . Wenn dies der Fall ist, haben Sie größere Probleme auf Ihren Händen als NullPointerException s. In diesem Zusammenhang hilft Ihnen NullPointerException s, auf schwerwiegende Probleme mit Ihrem JDBC-Treiber hinzuweisen. Die typische Überprüfung auf null vor dem Aufruf von close() würde das Problem im Hintergrund verbergen, wenn Ihr JDBC-Treiber Ihnen tatsächlich null -Referenzen liefert.

Außerdem stimmen nicht alle JDBC-Treiber genau mit der Spezifikation überein. Zum Beispiel werden einige Treiber nicht automatisch eine ResultSet schließen, wenn sie verknüpft ist Statement ist geschlossen. Daher müssen Sie sicherstellen, dass Sie explizit sowohl die ResultSet als auch ihre Statement (seufzen) schließen.

In der Praxis fand ich diese Technik nützlich (obwohl sie nicht die hübscheste ist):

%Vor%

Diese Methode garantiert, dass jede close() -Anweisung ausgeführt wird, beginnend mit der ResultSet und sich nach außen ausbreitend. NullPointerException s werden immer noch geworfen, wenn der Treiber Ihnen null referenzen liefert, aber ich erlaube dies aus den eingangs erläuterten Gründen. SQLException s werden weiterhin ausgelöst, wenn eine der close() -Anweisungen fehlschlägt (ich halte das für eine gute Sache - ich möchte wissen, ob etwas schief läuft).

    
Adam Paynter 22.12.2010 11:10
quelle
3

Ich sehe kein Problem mit Ihrer zweiten (ungewöhnlichen) Version.

  • Normalerweise wird rs nicht null sein, daher wird in seltenen Fällen eine NPE auftreten. Also sehe ich hier kein Leistungsproblem.
  • beide Versionen verhalten sich im Fall von rs = null genau gleich

Der einzige Nachteil - wenn wir mehr als eine Ressource zum Schließen haben, müssen wir für jede Ressource einen try / catch hinzufügen, wenn wir so viele Ressourcen wie möglich schließen wollen. Andernfalls würden wir die catch-Klausel mit dem ersten null eingeben, was undiscored leaks verursachen könnte.

So würde es aussehen:

%Vor%

... was immer noch lesbar und verständlich ist. Aber nach ändere nie ein allgemeines Muster - ich bleibe bei der altmodischen Art, null zuerst zu testen und SQLException beim Schließen zu fangen.

    
Andreas_D 22.12.2010 10:44
quelle
2

Ich neige dazu, den folgenden Ansatz zu verwenden. Ich denke, es ist gut, nach null zu suchen, weil es deine Absicht zeigt, d. H. Dass du erkennst, dass diese Objekte in seltenen Fällen null sein können. (Ein Null-Check ist auch schneller als die Erstellung eines NullPointerException .) Ich denke auch, dass es gut ist, die Ausnahmen zu protokollieren, anstatt sie zu verschlucken. In den Fällen, in denen close fehlschlägt, möchte ich etwas darüber wissen und habe es in meinen Protokolldateien.

%Vor%

Wenn Sie dies häufiger tun, anstatt diesen Code immer wieder zu kopieren und einzufügen, erstellen Sie eine Dienstprogrammklasse mit statischen Methoden, um das ResultSet, Statement und Connection zu schließen.

Mit DBUtils können Sie diese Bereinigung ganz einfach wie folgt durchführen:

%Vor%     
dogbane 22.12.2010 11:00
quelle
2
%Vor%     
Vickie 18.11.2014 15:19
quelle
1

Dies ist mein Ansatz für JDK 6. Wenn Sie JDK 7+ haben, verwenden Sie besser den hier beschriebenen Ansatz Ссылка

%Vor%
  • Es ist kurz.
  • Definiert eine Close-Methode, die statisch importiert werden kann.
  • Es vermeidet leere Catch-Blöcke.
  • Es behandelt jede mögliche SQLException (auch in getConnection oder close-Methoden).
  • Es ist null-sicher.
André 17.01.2012 18:18
quelle
0
%Vor%     
khachik 22.12.2010 10:33
quelle
0

Wenn Sie eine lange laufende Anwendung schreiben, sollten Sie das Verbindungs-Pooling in Betracht ziehen.

Das Apache-DBCP-Projekt macht eine Menge Arbeit für Sie. Sie könnten auch etwas wie Spring JDBC oder Hibernate betrachten.

Das Spring-Zeug verwendet Objekt-Pooling und fügt einige wirklich nette Methoden hinzu, um Jadb-Bosheit zu abstrahieren.

    
Fortyrunner 22.12.2010 10:50
quelle
0
%Vor%     
user467871 22.12.2010 11:07
quelle

Tags und Links