2016-05-25 7 views
0

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!

Antwort

0

1) Bei einem Festschreibungsintervall von 1 würde ein einzelner Thread die 100 Datensätze auswählen und dann mit der Verarbeitung und/oder dem Schreiben beginnen, wie im Schritt definiert. Nach Abschluss des Schritts sollte eine weitere Abfrage ausgelöst werden, um weitere 100 Datensätze auszuwählen.

2) Das ist richtig

3) Man könnte die Größe des Speichers an die JVM zur Laufzeit gegeben erhöhen. Ich bin mir nicht sicher, ob Sie planen, dass dies ein Prozess ist, der sich dreht und nach dem Abschluss getötet wird, oder wenn der Prozess kontinuierlich über einen bestimmten Zeitraum läuft. In jedem Fall wird jedoch, wenn dies für ein System auf Produktionsebene ist, die Verwendung eines JobRepository im Speicher dringend empfohlen. Einer der wichtigsten Vorteile von Spring Batch ist die Möglichkeit, historische Aufzeichnungen im JobRepository nach einem Neustart eines Jobs zu durchsuchen und dem Entwickler die Möglichkeit zu geben, sie als zusätzliche Daten zu verwenden, um eventuelle Probleme eines Jobs zu ermitteln.

+0

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? –

+0

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). –

+0

Vielen Dank, dass Sie das erklärt haben. –

Verwandte Themen