0 Tage Serie
java / intermediate
Snippet

Streaming großer Datenbank-Ergebnismengen mit dem RowCallbackHandler von Spring JdbcTemplate

Das Laden von Millionen Datenbankzeilen als Domänenobjekte kann zu OutOfMemoryErrors führen. Durch die Verwendung von RowCallbackHandler mit konfigurierter Fetch-Size werden Zeilen sequenziell verarbeitet, ohne gesamte Ergebnismengen im Heap zu puffern.

snippet.java
java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Service
public class ReportExportService {
private final JdbcTemplate jdbcTemplate;
public ReportExportService(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public void streamLargeDataset(OutputStream outputStream) {
jdbcTemplate.setFetchSize(500);
jdbcTemplate.query("SELECT id, payload FROM large_events", (RowCallbackHandler) rs -> {
String record = rs.getLong("id") + "," + rs.getString("payload") + "\n";
outputStream.write(record.getBytes(StandardCharsets.UTF_8));
});
}
}
spring
Erklärung
1
jdbcTemplate.setFetchSize(500);
Weist den JDBC-Treiber an, Zeilen in 500er-Batches abzurufen, anstatt alle Datensätze auf einmal in den Speicher zu laden.
2
jdbcTemplate.query("SELECT id, payload FROM large_events", (RowCallbackHandler) rs -> {
Führt die Abfrage aus und ruft den Callback zeilenweise auf, ohne eine Zwischenliste im Speicher anzulegen.
3
outputStream.write(record.getBytes(StandardCharsets.UTF_8));
Schreibt transformierte Datensätze direkt in den Ausgabestrom, um den Heap-Verbrauch minimal zu halten.