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
@Servicepublic 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.