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.
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).
Ich sehe kein Problem mit Ihrer zweiten (ungewöhnlichen) Version.
null
sein, daher wird in seltenen Fällen eine NPE auftreten. Also sehe ich hier kein Leistungsproblem. 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.
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.
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%Dies ist mein Ansatz für JDK 6. Wenn Sie JDK 7+ haben, verwenden Sie besser den hier beschriebenen Ansatz Ссылка
%Vor%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.