ResultSet - Wie arbeitet sowas intern

Status
Nicht offen für weitere Antworten.

RaoulDuke

Bekanntes Mitglied
Hallo,

wenn ich ein SQL Statement ausführe und ein ResultSet erhalte, steht dieses ResultSet noch in Verbindung mit der Datenbank und liest die Daten zeilenweise, jedesmal wenn ich next() aufrufe, aus der Datenbank, oder sind in dem Moment schon alle Daten die mein SQL Query geliefert hat im Speicher meine Java Programms?

Wenn ich z.B. eine Tabelle mit vielen Einträgen habe, ich aber z.B. nur Zeile 1000-1100 haben will, kann ich ja das ResultSet mit absolute() auf Zeile 1000 setzen. Das sollte dann dazu führen das die Zeilen die vorher kommen garnicht aus der Datenbank entnommen werden, oder?
 
RaoulDuke hat gesagt.:
Hallo,

wenn ich ein SQL Statement ausführe und ein ResultSet erhalte, steht dieses ResultSet noch in Verbindung mit der Datenbank und liest die Daten zeilenweise, jedesmal wenn ich next() aufrufe, aus der Datenbank, oder sind in dem Moment schon alle Daten die mein SQL Query geliefert hat im Speicher meine Java Programms?
Nein, das ResultSet ist wie ein Cursor. Du kriegst nur die Daten, die du liest.
Für das, was du willst, ist z.B. CachedRowSet gedacht. Es liest die Daten komplett
ein und kann auch ohne eine Verbindung zur Datenbank verwendet werden.
RaoulDuke hat gesagt.:
Wenn ich z.B. eine Tabelle mit vielen Einträgen habe, ich aber z.B. nur Zeile 1000-1100 haben will, kann ich ja das ResultSet mit absolute() auf Zeile 1000 setzen. Das sollte dann dazu führen das die Zeilen die vorher kommen garnicht aus der Datenbank entnommen werden, oder?
Eigentlich schon, du musst aber explizit so ein ResultSet erstellen lassen. Auch nicht jeder JDBC-Treiber
unterstützt dies. Siehe hierzu Connection#createStatement(int resultSetType, int resultSetConcurrency)
bzw. Connection#prepareStatement(String sql, int resultSetType, int resultSetConcurrency)
Wenn du den Typen nicht angibst, dann kriegst du ein ResultSet vom Typ ResultSet.TYPE_FORWARD_ONLY.
Damit kannst du nur vorwärts lesen, aber nicht zu einem bestimmten Datensatz mir ResultSet#absolute(...)
springen. Klartext: Keine absolute Positioniereung, es sei denn du erstellst ein ResultSet von Typ
ResultSet.TYPE_SCROLL_INSENSITIVE oder ResultSet.TYPE_SCROLL_SENSITIVE
 
Ok, danke, das wollte ich nur wissen. Ich will garnicht alle Zeilen im Speicher haben, deswegen frag ich. So wie es ist isses genau das was ich will.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben