Ich habe einen Code wie folgt unten,resultSet.next(): Ruft es Daten aus dem Puffer ODER aus der Datenbank ab?
try (Connection connection = this.getDataSource().getConnection();
PreparedStatement statement = connection.prepareStatement(sqlQuery);) {
try {
statement.setFetchSize(10000); // Set fetch size
resultSet = statement.executeQuery();
while (true) {
resultSet.setFetchSize(10000);
boolean more = resultSet.next();
if (! more) {
break;
}
// populating an arraylist from the value from resultSet
}
}
catch (Exception e) {
LOGGER.error("Exception : "+e);
}
} catch (SQLException e) {
LOGGER.error("Exception : "+e);
}
Mein Verständnis ist, wie folgt,
Die Aussage Fetch-Größe ist 10000. wenn statement.executeQuery() ausgeführt wird, gibt sie den ResultSet Cursor. Es wird 10000 Zeilen im Speicher haben. Wenn resultSet.next aufgerufen wird, wird eine Zeile aus dem Speicherpuffer abgerufen. (eine Zeile pro Anruf). Wenn keine weiteren Zeilen im Speicher vorhanden sind, wird die Abfrage erneut ausgelöst, und 10000 Zeilen werden erneut aus der Datenbank abgerufen und im Puffer gespeichert. Dies setzt sich fort, bis es keine Zeilen ist also von DB
geholt werden, wenn mein Verständnis richtig ist, wie viele tatsächliche DB nennt für insgesamt Reihen von 210.000 dort sein? Ist es 21? (210000/10000)
Auch wenn und wer die DB aufruft (wenn Zeilen im Puffer alle gelesen werden), um mehr Zeilen zu bekommen (10000, in meinem Fall) und im Puffer zu speichern. Wann wird der Puffer gelöscht?
Bitte korrigieren Sie mich, wenn ich falsch in meinem Verständnis bin.
Ich muss mit Millionen von Daten in Oracle Database arbeiten.
Vielen Dank für jede Zeiger/Infos
Grüße,
SD
Die 'setFetchSize #' Methode soll ein Hinweis sein. Es hängt vollständig vom JDBC-Treiber ab, ob es verwendet oder ignoriert wird. Auch wer die DB anruft - der Fahrer macht das. Habe das meiste davon [SO Q/A] (http://stackoverflow.com/questions/1318354/what-does-statement-setfetchsizensize-method-really-do-in-sql-server-jdbc-driv) –
Im Falle des OCI-Treibers gibt es einen Abschnitt in der Dokumentation, der die Anzahl der Netzwerk-Round-Trips pro OCI-Aufruf beschreibt. Der JDBC-Treiber ist nicht auf diese Weise dokumentiert - er bietet API auf höherer Ebene. Sie können das OCI-Dokument jedoch als Einführung in das Thema verwenden. – ibre5041