# Wann werden Daten übertragen bzw geladen



## ARadauer (20. Feb 2008)

Wenn ich jetzt über JDBC eine Datenbankabfrage durchführe, wann werden genau die Daten vom Server übertragen?
executeQuery,
resultSet.net,
oder 
rset.getString...

kann man das so einfach sagen, oder ist das Datenbank abhängig?


----------



## maki (20. Feb 2008)

Würde mal sagen, nachdem eine Query ausgeführt worden ist.


----------



## ms (21. Feb 2008)

Üblicherweise enthält ein ResultSet einen Cursor der bei Bedarf (ResultSet#next()) Daten vom Server nachlädt.
http://java.sun.com/products/jdbc/driverdevs.html
Punkt A.5.1 Prefetch Rows

ms


----------



## FenchelT (21. Feb 2008)

Hallo Aradauer,

wenn Du das wirklich so genau wissen moechtest, dann koennte ich fuer den MSSQL Server z.B. einen Log mitlaufen lassen und Dir sagen, an welcher Stelle genau die Daten geholt werden.

Ist ca. 10 Min. aufwand.

Vom Gefuehl her wuerde ich aber sagen, dass das beim executeQuery durchgefuehrt wird.
REsultSet.next kann ich mir irgendwie nicht vorstellen, ich denke da sind die Daten schon im ResultSet.
Ich gehe davon aus, dass die Handhabung aehnlich ist, wie beim CachedRowSet.
Da laedts Du die Daten ja auch nicht jedes Mal nach, wenn Du ein .next() aufrufst.


Aber wie gesagt, wenn Du moechtest, logge ich das fuer DIch mit


Gruesse


----------



## tfa (21. Feb 2008)

Ich würde sagen, die Daten werden durch das rset.next() geholt, und zwar dann, wenn es nötig ist. Ein ResultSet kann ja 1000000 Datensätze enthalten, die werden nicht alle auf einmal geladen.
Siehe auch java.sun.com/javase/6/docs/api/java/sql/Statement.html#setFetchSize(int)


----------



## robertpic71 (21. Feb 2008)

Eine eindeutige Antwort zu diesem Thema ist nicht einfach, da es letztendlich von der Implementierung (und den Fähigkeiten der Datenquelle)  sowie den Defaultwerten des JDBC-Treibers abhängt.

Wichtige Einstellungen sind:
*ResultSet Type:*
ResultSet.TYPE_FORWARD_ONLY, ResultSet.TYPE_SCROLL_INSENSITIVE, or ResultSet.TYPE_SCROLL_SENSITIVE 

*FetchDirection:*
ResultSet.FETCH_FORWARD, ResultSet.FETCH_REVERSE, or ResultSet.FETCH_UNKNOWN

*ResultSetConcurrency*
ResultSet.CONCUR_READ_ONLY or ResultSet.CONCUR_UPDATABLE

und die schon erwähnte
*FetchSize*
Wobei (zumindest in der Vergangenheit) das nicht alle Treiber unterstützen.

Ein üblicher Weg um ein gestreamtes ResultSet zu erhalten ist:

```
stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,
java.sql.ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(Integer.MIN_VALUE);
```
Um den Komfort von resultSet.last() anzubieten, sind die Defaultwerte meist anders. Bei Memoryproblemen in Verbindung mit ResultsSets wird zu dieser Einstellung geraten.

Bei manchen Treibern kann man das Buffern über die Einstellungen steuern, z.B. beim M$-JDBC-Treiber mit setResponseBuffering("adaptive").

Also sichere Aussagen kann man nur für den jeweiligen JDBC-Treiber treffen. Wenn die Doku nicht genug hergibt muss man wohl tracen.

BTW: Welche Datenbank bzw. welchen Treiber verwendest du?

Was JDBC angeht, habe ich noch keine Traceerfahrung (benötigt). Aus M$-Zeiten kann ich noch den ODBC-Weg beschreiben, der wahrscheinlich auch in vielen JDBC-Treiber Anwendung findet.
Per Default wird das ganze ResultSet einglesen, allerdings nur die relativeRecordNumber je Satz. Wenn man den Satz dann in der Applikation verarbeitet, werden die Daten mit der Satznummer abgeholt. 

/Robert


----------

