Freigabe von Datenbank Ressourcen

xanadoo

Erfahrenes Mitglied
Hallo zusammen

Mit JDBC ist es ja angeblich ausreichend wenn nur die Connection geschlossen wird, da die Ressourcen-Freigabe des Statement und des ResultSet automatisch kaskadierend wird.
Ich habe allerdings gelernt, auch diese immer zu schliessen.

Nun überarbeite ich eine Client-Applikation, welche über eine HSQLDB gewisse Daten einliest. Es gibt nur eine einzige Connection, welche beim Start des Programms geöffnet- und beim Beenden wieder geschlossen wird.

Währen der Laufzeit werden (je nach dem wie lange die Applikation läuft) unzählige Statement und ResultSet gemacht, aber nie geschlossen (bis eben dann beim Beenden des Programms die Connection geschlossen wird).

Nun Frage ich mich, ob man dies wirklich so machen kann / darf / soll?
Denn ich befürchte dass dies eine ziemliche Ressourcenverschwendung ist.
Die Statements und ResultSets werden z.T. in while-Schlaufen erzeugt welche mehrere 1000 Durchgänge aufweisen.


Gruss Xanadoo
 
Hallo,

Mit JDBC ist es ja angeblich ausreichend wenn nur die Connection geschlossen wird, da die Ressourcen-Freigabe des Statement und des ResultSet automatisch kaskadierend wird.
Ich habe allerdings gelernt, auch diese immer zu schliessen.

AFAIK sollten nach JDBC Spec beim Aufruf von Connection.close() alle damit verbunden Artefakte (wie resultSets / Statements) mitgeschlossen und die damit verknüpften Ressourcen freigegeben werden könnnen.
Das ist aber eben nur Spec und die JDBC Treiber Hersteller halten sich nicht immer daran. Deshalb ist es sinnvoll
dieses Resourcenmanagement zu betreiben oder einen entsprechenden Mechanismus zu verwenden der dieses "Low-Level" Ressourcehandling für den Entwickler übernimmt. Eine Möglichkeit wäre beispielsweise die Verwendung von Spring JDBC.

Weiterhin sollten JDBC Ressurcen so früh wie möglich geschlossen werden um die Speicherauslastung gering zu halten.
Sonst dauerts u.U. bis zum Programm-Exit bis irgendwas wieder freigegeben wird- und das dauert in der Regel viel zu lange
und man hat wieder User die behaupten Java Anwendungen wäre langsam...

Nun Frage ich mich, ob man dies wirklich so machen kann / darf / soll?
Denn ich befürchte dass dies eine ziemliche Ressourcenverschwendung ist.
Die Statements und ResultSets werden z.T. in while-Schlaufen erzeugt welche mehrere 1000 Durchgänge aufweisen.
Ich hoffe doch sehr, dass du hier nicht bei jeder Iteration eine neue Statement-Instanz erzeugst sondern PreparedStatements verwendest...

Gruß Tom
 
Danke für deine Antworten.

Habe doch gedacht, dass es einen Sinn haben wird, dass ich bisher das Zeugs nach Gebrauch sofort geschlossen habe.
Die Applikation die ich gerade überarbeiten soll ist halt schon einige Jahre im Einsatz, und wurde nicht von mir geschrieben.

Das die Anwendung langsam ist ist genau das Problem.
Und, dass in einer Schleife ein PreparedStatement verwendet wird hätte ich auch erwartet,
dies war allerdings nicht der Fall.

Hab das dann mal schnell geändert, leider hat es nicht viel gebracht.

Das Problem ist, dass pro Zeile des Erbebnisses der 1. Query eine 2. Query abgesetzt wird.
Ich habe nun mal die Query umgeschrieben dass es mit nur einer geht. Allerdings dauert alleine das Auswerten der Query (direkt im HSQLDB - Manager) immer noch 30 Sek!

Naja, mal schauen was sich da noch machen lässt...
 
Zurück