Ich arbeite an einem Batch-Job, wo ich Step-Partitionierung und JDBCPagingItemReader für das Abrufen von Daten mit Seitengröße 100, Thread-Anzahl 5 verwende. Ich habe das Programm im Debug-Modus für 3000 Datensätze in DB und gefunden jeweils des Threads wird die folgende Abfrage ausgelöst, um die Daten aus der Datenbank abzurufen.Wie JDBCPagingItemReader Daten abruft
SELECT * FROM (SELECT CASE_NUM, STTS_CD, UPDT_TS, OFC_CD, OFC_NUM, CHNL_CD, APRV_OFC_CD, APRV_OFC_NUM, TYP_CD, ROW_NUMBER() OVER (ORDER BY CASE_NUM) AS RowNumber FROM T_CASE WHERE PROC_INDX = 'P') als Daten, bei denen rownumber ZWISCHEN: fromRow UND: toRow ORDER BY rownumber ASC FETCH FIRST 100 ROWS ONLY
Meine Frage ist
1) Wenn Intervall 1 commit (Dies ist wegen meiner Geschäftsanforderung), dann einmal die 100 Datensatz sind Wird dieser Thread von einem beliebigen Thread verarbeitet, so wird dieser Thread eine weitere Abfrage auslösen, um den nächsten Chunk von 100 Datensätzen zu erhalten, oder er wird die Abfrage fortsetzen und die Daten zwischenspeichern.
2) Es gibt nur 5 Thread * 100 Chunk = 500 aktive Datensätze zu einem bestimmten Zeitpunkt im Speicher?
3) Ich verwende im Speicher Job-Repository. Gibt es Richtlinien oder Best Practices, um OutOfMemoryError in solchen Fällen zu vermeiden?
Experte sucht Ihre Hilfe hier. Danke im Voraus!
Dank @Ryan Waskiewicz für die sofortige Antwort. Da Ihre Antwort alle meine Fragen abdeckt, akzeptiere ich Ihre Antwort. Noch eine Frage, irgendeine Idee, was wäre die Größe des Job-Repository, wenn ich 3000 DB-Zeilen mit 5 Threads verarbeite? –
Es hängt mehr von der Art der Arbeit ab als von der Verarbeitung. Das JobRepository speichert Informationen über die Anzahl der Läufe des Jobs, die übergebenen JobParameter und den Status der Jobs/eingeschlossenen Schritte. Je mehr Ihr Job ausgeführt wird, ohne dass der Java-Prozess beendet wird, desto mehr Datensätze werden generiert (und daher wird mehr Arbeitsspeicher benötigt). –
Vielen Dank, dass Sie das erklärt haben. –