Weitere aktuelle Java-Titel finden Sie bei dpunkt.
 Inhaltsverzeichnis   Auf Ebene Zurück   Seite Zurück   Seite Vor   Auf Ebene Vor   Eine Ebene höher   Index


18.10.1

Row Prefetching


Beim Row Prefetching werden nach der Ausführung einer SQL-Abfrage werden nicht alle Ergebniszeilen sofort zum Client übertragen, sondern sie werden nach Bedarf vom Datenbanksystem angefordert. Ein ResultSet enthält somit nicht sofort nach der Ausführung alle Daten, sondern stellt lediglich den Mechanismus zum Abrufen der Daten bereit.

Wird jede Ergebniszeile einzeln vom Datenbanksystem zum Client übertragen, muss relativ viel Kommunikation mit dem Datenbanksystem durchgeführt werden. Das macht sich besonders dann bemerkbar, wenn man aufeinanderfolgend sehr viele Zeilen vom ResultSet-Exemplar abruft. In den meisten Fällen ist es effizienter, die Daten in größeren Portionen (die Größe dieser Portionen wird im Folgenden Abfragegröße genannt) zum Client zu übertragen und dort zwischenzupuffern. Wurden alle Daten im Puffer verarbeitet, fordert das ResultSet die nächsten Datensätze vom Datenbanksystem an.

Ist die Abfragegröße größer eins, kann das ResultSet intern auf die gepufferten Ergebniszeilen zurückgreifen. Erst wenn der Satzzeiger auf eine Ergebniszeile gesetzt wird, die sich nicht mehr im Puffer befindet, fordert das ResultSet-Exemplar erneut neue Ergebniszeilen vom Datenbanksystem an, genau so viele, wie die Abfragegröße definiert.

Wenn man die Abfragegröße zu niedrig setzt, muss viel Kommunikation mit dem Datenbanksystem durchgeführt werden, da relativ oft neue Ergebniszeilen abgerufen werden müssen. Bei einem hohen Wert dagegen wird mehr Speicher verbraucht, da die Ergebniszeilen auf Client-Seite zwischengespeichert werden. Die optimale Abfragegröße hängt daher von der Charakterisik der Anwendung ab. Der Oracle JDBC-Treiber verwendet z. B. intern einen voreingestellten Wert von 10 Zeilen.

Row Prefetching spielt nicht nur beim Zugriff auf Abfrageergebnisse eine Rolle, sondern auch bei der Aktualisierung von Zeilen in Ergebnissmengen mit der Methode refreshRow(). Beim Aufruf kann der interne Datenpuffer komplett neu gefüllt werden, wodurch effektiv mehr als eine Zeile vom Server aktualisiert wird, vorausgesetzt, die Abfragegröße ist größer als eins. Die Abfragegröße hat außerdem Einfluss auf die Aktualisierungsrate einer Scroll-sensitiven Ergebnismenge, denn auch hier gilt: Daten werden nur dann vom Datenbankserver angefordert, wenn ein Satz angefordert wird, der sich nicht im Puffer befindet.

Abbildung 18.22: Row Prefetching in JDBC 2.0
Abbildung 18.22

Die Abfragegröße kann für Exemplare der Klassen Statement, PreparedStatement, CallableStatement und ResultSet gesetzt werden. Gesetzt wird der Wert jeweils über die Methode setFetchSize(), wie folgendes Beispiel zeigt:
  Statement stmt = con.createStatement();
  stmt.setFetchSize(5);
Analog dazu erfolgt die Anwendung auf PreparedStatement- und CallableStatement-Exemplare.

Auf dieselbe Art wird die Abfragegröße in einem ResultSet-Exemplar gesetzt:
  String sql = "SELECT * FROM titel";
  ResultSet rs = stmt.executeQuery(sql);
  rs.setFetchSize(2);
  // Zugriff auf das Ergebnis
Im Code-Beispiel wird die Abfragegröße lokal für das ResultSet-Exemplar neu definiert und somit der im Statement gesetzte Wert überschrieben. Wird der Wert nicht explizit gesetzt, wird der entsprechende Wert vom ausführenden Statement-Objekt als Abfragebröße verwendet.


 Inhaltsverzeichnis   Auf Ebene Zurück   Seite Zurück   Seite Vor   Auf Ebene Vor   Eine Ebene höher   Index

Copyright © 2002 dpunkt.Verlag, Heidelberg. Alle Rechte vorbehalten.