RowSets als Erweiterung von JDBC ResultSets

Verbindungsabbruch

Rudolf Jansen

Eine Abarbeitung von aus der Datenbank ausgelesenen Werten ohne geöffnete Datenbankverbindung ist über JDBC ResultSets nicht möglich. RowSets bieten dem JDBC-Programmierer an dieser Stelle mehr Flexibilität sowie die Möglichkeit, SELECT-Ergebnisse Bean-basiert zu verarbeiten.

Jeder JDBC-Entwickler hat sicherlich bereits mit JDBC ResultSets gearbeitet. Ein ResultSet-Objekt beinhaltet die Rückgabemenge einer SELECT-Abfrage. Je nach Typ des ResultSet sind diverse Navigationen innerhalb dieser Ergebnismenge möglich (Vorwärtsschritte über die next()-Methode, Rückwärtsschritte über die previous()-Methode, absolute und relative Sprünge). Insbesondere in datenintensiven Anwendungen werden ResultSets häufig über einen längeren Zeitraum verarbeitet, vor allem vor dem Hintergrund, dass Datenbankzugriffe über JDBC eine vergleichsweise teure, d.h. ressourcenaufwändige Operation darstellen und daher lieber ein einzelner umfangreicher SELECT-Befehl implementiert werden sollte als viele kleine SELECT-Abfragen. Während der Abarbeitung eines ResultSet muss die zugrunde liegende Datenbankverbindung in Form einer JDBC Connection immer geöffnet bleiben, auch wenn während dieser Verarbeitung eigentlich keine weiteren Datenbankzugriffe benötigt werden. Ein Schließen der Verbindung über einen Befehl conn.close(); schließt automatisch alle über diese Verbindung angelegten Statements und damit auch alle über diese Statements erzeugten ResultSets.Eine Datenbankverbindung ist aber eine ressourcenaufwändige Konstruktion. Insbesondere in größeren (Web-)Anwendungen werden Datenbankverbindungen daher meist innerhalb eines Connection Pool gehalten, aus dem sie dann bei Bedarf in Form einer Client-Anfrage entnommen werden können. Zum guten Programmierstil innerhalb von solchen Enterprise-Anwendungen gehört es, dass solche Datenbankverbindungen innerhalb von Client-Anfragen nicht länger gehalten werden als unbedingt nötig. Sobald eine Verbindung nicht mehr benötigt wird, wird sie nicht geschlossen, sondern in den Pool zurückgelegt, damit sie dort für neue Anfragen in anderen Sessions wieder zur Verfügung steht. Wünschenswert wäre also eine Möglichkeit, eine Datenbankverbindung bei der Verarbeitung größerer Datenbestände nur dann zu verwenden, wenn sie wirklich benötigt wird, d.h. beim initialen Auslesen der Daten sowie am Ende der Verarbeitung zum Zurückschreiben eventuell geänderter Daten. In der Zwischenzeit – und dieser Zeitraum kann insbesondere dann recht lang sein, wenn Benutzereingaben verarbeitet werden müssen – braucht die Anwendung eigentlich keine offene Datenbankverbindung. Gesucht sind also ResultSets, mit denen auch offline, d.h. ohne offene Datenbankverbindung gearbeitet werden kann.Eine solche Erweiterung der java.sql.ResultSet-Schnittstelle bieten RowSets. RowSets selber sind zunächst nicht auf die Datenbankwelt beschränkt. Grundsätzlich kann man sich unter einem RowSet einen Container für tablenförmige Daten vorstellen. Diese können auch aus Excel- oder sonstigen Betriebssystemdateien stammen. Im Zusammenhang mit Datenbanken stellt ein RowSet alle Methoden der zugrunde liegenden ResultSets zur Verfügung. Wie die folgenden Sourcecode-Beispiele zeigen, besteht der Unterschied aber darin, dass ein RowSet je nach Implementierung nicht zwingend eine durchgängig geöffnete Datenbankverbindung benötigt. Ein weiterer Vorteil von RowSets ist die Tatsache, dass ein RowSet als JavaBean realisiert ist und somit die grundlegenden Eigenschaften von JavaBeans im Zusammenhang mit Datenbankabfrage-Ergebnissen zur Verfügung stellt. Zu nennen sind dabei insbesondere

OracleCachedRowSet rowSet =  new OracleCachedRowSet ();
rowSet.populate (resSet);
Geschrieben von
Rudolf Jansen
Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.