Streamen statt materialisieren: lies mit einem scrollbaren Cursor oder Keyset-Paging, setz eine Fetch Size, damit der Treiber nicht alles puffert, und verarbeite in Chunks mit einem Commit pro Chunk. Nutzt du JPA, leer den Persistence Context zwischen den Chunks oder nimm eine Stateless Session, sonst bleibt jede Entity im First Level Cache. Batche die Schreibzugriffe mit JDBC Batching und mach den Job vom letzten committeten Chunk aus neu startbar.
Warum Interviewer das fragen
Batch-Arbeit ist genau dort, wo das Speicherverhalten der JVM und das Verhalten des Persistence Context sichtbar werden, das prüft also praktische Erfahrung statt Theorie. Der Interviewer will Streaming, Commits in Chunks, das Leeren des Persistence Context und Neustartbarkeit. Zu wissen, dass ein JDBC-Treiber das gesamte Result Set puffern kann, egal was dein Code macht, solange Fetch Size und Transaktionseinstellungen nicht stimmen, ist ein starkes Signal.
So baust du deine Antwort auf
- Schließ aus, alles zu laden: den Read streamen oder pagen.
- Erklär Fetch Size und das Pufferverhalten des Treibers.
- Behandle den Persistence Context, damit sich keine Entities ansammeln.
- Ergänze Commits in Chunks, gebatchte Writes und Neustartbarkeit.
Beispielantwort
Die Kernregel ist, dass kein Schritt zwanzig Millionen von irgendetwas hält. Ich lese mit Keyset-Paging auf dem Primärschlüssel oder mit einem scrollbaren Cursor mit expliziter Fetch Size, und man sollte wissen, dass manche Treiber das ignorieren und das gesamte Result Set puffern, solange man nicht zusätzlich in einer Transaktion mit ausgeschaltetem Autocommit läuft, was Leute schmerzhaft entdecken, wenn der Heap voll ist, bevor die Verarbeitung überhaupt beginnt. Dann verarbeite ich in Chunks von ein paar tausend, schreibe mit JDBC Batching, damit es ein Roundtrip pro Chunk ist statt pro Zeile, und committe pro Chunk. Bei JPA kommt die zusätzliche Falle mit dem Persistence Context: jede gelesene Entity bleibt managed, der Speicher wächst also und Flushes werden langsamer, weil das Dirty Checking mehr Objekte durchläuft. Ich leere ihn pro Chunk oder nehme eine Stateless Session. Neustartbarkeit zählt genauso viel wie Speicher, der Job merkt sich also den letzten committeten Schlüssel, ein Fehler bei Zeile achtzehn Millionen setzt also fort statt neu zu starten. Und ich drossle ihn, denn ein Batch-Job, der die Datenbank um zwei Uhr nachts sättigt, trifft trotzdem alle, die wach sind.
Steht dieses Vorstellungsgespräch bald an? GhostPilot hört bei deinem Live-Call mit, erkennt die Frage in dem Moment, in dem sie gestellt wird, und bringt dir eine strukturierte Antwort in Echtzeit auf den Bildschirm. Probier es im nächsten Mock aus, oder hol dir einen $29 Session Pass, kein Abo, für den Ernstfall.
So funktioniert esNachfragen, mit denen du rechnen solltest
- Warum wird der Persistence Context langsamer, während er wächst?
- Wie würdest du das sicher über Partitionen hinweg parallelisieren?
- Wie machst du die Transformation idempotent für einen Neustart?
Weitere Fragen für Java-Entwickler
Dein Interviewer stellt seine eigene Version davon. Kopier deine echte Stellenbeschreibung in den kostenlosen Question Predictor und bekomm die 20 Fragen, die diese Rolle am wahrscheinlichsten stellt, samt dem, worauf jede wirklich abzielt.
Meine Fragen vorhersagen