2009-06-03 7 views
4

Ich verwende Verbindungspooling in meiner Anwendung. Meine Frage ist:Ist statement.close() explizit in Verbindung Poolumgebung erforderlich?

Ist es explizit erforderlich, die Anweisung vor dem Schließen der Verbindung im Falle einer Verbindung gepoolten Umgebung zu schließen?

In der Verbindung wird die Verbindung zur gepoolten Umgebung nicht geschlossen, (sondern kehrt zum freien Verbindungspool zurück). Ich hatte jdbc 4.0 funktionale Spezifikationen überprüft. In Punkt Nummer 9.4.4 heißt es eindeutig:

Verbindungsobjekte schließen Eine Anwendung ruft die Methode Connection.close auf, um anzuzeigen, dass sie eine Verbindung beendet hat. Alle Statement-Objekte, die aus einem bestimmten Connection-Objekt erstellt wurden, werden geschlossen, wenn die Methode close für das Objekt aufgerufen wird. Sobald eine Verbindung geschlossen wurde, führt jeder Versuch, auf eine ihrer Methoden zuzugreifen, mit Ausnahme der Methoden close, isClosed oder isValid, dazu, dass eine SQLException ausgelöst wird.

So jdbc specs mandates schließen alle Anweisung zu einem Zeitpunkt der Schließung der Verbindung. Ist es also nur für gepoolte Umgebungen ohne Verbindung oder nur für gepoolte Umgebungen mit Verbindung anwendbar?

Laut mir sollte es im Falle einer gepoolten Umgebung nicht wichtig sein, weil wir für die Schnittstelle codieren (java.sql.Connection & java.sql.Statement). Wir kümmern uns also nicht um die Implementierung, und die Elternklasse (java.sql.Connection) hat keine Informationen über die Kind-/Implementierungsklasse (Herstellerimplementierungsklasse).

+0

Wenn jdbc-Spezifikationen alle Implementierungen zum Schließen einer Anweisung zum Schließen der Verbindung vorschreiben, können wir die Methode "statement.close" problemlos überspringen, wenn wir die connection.close-Methode verwenden (in gepoolter oder nicht gepoolter Umgebung). –

+0

... ist das eine Frage? –

Antwort

4

Jedes Objekt, das close(), release(), destroy() usw. hat, schlägt automatisch vor (natürlich Sie sollte die API-Dokumentation lesen, es könnte verschiedene Namen für diesen Zweck geben), dass das Objekt einen Aufruf dieser Methode benötigt, um sicherzustellen, dass die Objektressourcen freigegeben werden, wenn das Objekt nicht mehr verwendet wird. Es gibt keinen Grund, solche zu liefern eine Methode, wenn das Objekt das alleine kann.

Bei gepoolten java.sql.Connection, wird die Verbindung nicht wirklich geschlossen ist, wird gerade in den Pool als verfügbar Verbindung geschoben, aber das ist interne Sachen aka Sie nicht kümmern sollte.

+0

Ich stimme zu, dass es Ihnen egal sein sollte, solange die gepoolte Verbindung den durch die Dokumentation definierten Vertrag erfüllt (d. H., Das Schließen der Verbindung schließt auch alle zugehörigen Anweisungen). Allerdings, in Ermangelung einer solchen Garantie, müssen Sie sich leider kümmern. –

7

Absolut. Es ist möglich, dass die Statement Implementierung andere Ressourcen hat, die freigegeben werden sollten oder eine andere Beziehung mit der Verbindung haben. Sie kennen die Implementierungsdetails nicht und sollten dies auch nicht tun.

Ihr Ansatz ist absolut richtig: Code zur Schnittstelle und vermeiden Sie kleine "Abkürzungen", die Sie später leicht beißen können. (Auch wenn es jetzt funktioniert, könnte es in einer zukünftigen Version der Pool- oder Verbindungsklassen nicht vorkommen.)

+1

Die anderen Studenten in meiner Datenbank-Klasse in der Schule können die Wichtigkeit des Aufrufs von .close bestätigen.Meine Anwendung hat es versäumt, nahe zu schließen und endete damit, dass viele veraltete Verbindungen auf dem DB-Server erstellt wurden. So sehr, dass es anfing, neue Verbindungen zu verhindern. Die Nacht vor dem Projekt war fällig. – JaredPar

2

Meiner Erfahrung nach haben einige JDBC-Treiber Fehler. Sie scheinen am besten zu funktionieren, wenn Sie alle Anweisungen (und ResultSets) manuell schließen. Ansonsten habe ich Ressourcenlecks gesehen, die nach dem Schließen der Verbindung nicht bestehen bleiben sollten.

Verwandte Themen