2017-11-27 6 views
0

Ich schreibe eine Stapelverarbeitung mit Spring Batch. Ich muss ca. 2 000 000 Datensätze von der Datenquelle (Oracle-Datenbank) zum Ziel (Kafka-Broker) verschieben. Ich zögere, welche ItemReader sollte ich für diesen Job wählen:Spring Batch JdbcCursorItemReader oder RepositoryItemReader?

  • JdbcCursorItemReader: Wenn ich das richtig verstanden, wird es den Cursor öffnen, die durch die ResultSet aller dieser Datensätze iteriert werden, eins nach dem anderen Leistung ist kein Problem; unter der Hauben-Datenbank hält eine Momentaufnahme von Datensätzen, die erfüllen, wobei Klausel zum Zeitpunkt der Abfrageausführung;

  • RepositoryItemReader: vielleicht weniger performant sein, Partitionierung basierend auf Paging-Mechanismus für jede Seite wird die Abfrage ausgeführt werden, die Möglichkeit, einige Aufzeichnungen ommiting, der Datenbank geschrieben werden kann während von 2 000 000 Datensätze holen, die wouldn ‚t im ersteren Fall geschehen (ist meine Argumentation auch richtig?)

Zusammenfassung: als Folge ich alle diese 2 000 000 Datensätze senden möchten, wie sie in einem zum Zeitpunkt der Ausführung der Abfrage waren partitionierte Art und Weise. Überlege ich dieses Problem? Vielleicht ist das Überspringen neuer Datensätze kein Problem, wenn der Job später aktualisiert wird? Oder ist meine Argumentation bezüglich RepositoryItemReader nicht korrekt?

Antwort

0

Es ist nicht immer ideal, einen Cursor längere Zeit geöffnet zu lassen. Abhängig von der verwendeten Datenbank wird diese möglicherweise nicht optimiert. d. h., einige DBs honorieren fetchSize nicht und werden die Ergebnisse eins nach dem anderen abrufen, wenn sie angefordert werden.

Ich würde mit dem RepositoryItemReader oder einer der PagingItemReader-Implementierungen gehen.

Ich bin nicht ganz gefolgt, wenn Sie daran interessiert sind, dass Sie neue Datensätze weglassen oder nicht.

Wenn Sie neue Datensätze auslassen möchten, sollten Sie in der Lage sein, Ihrer where-Klausel ein Prädikat hinzuzufügen, um ein bestimmtes ID- oder Timestamp-Feld nicht zu übergeben. Wenn keine von beiden verfügbar ist, können Sie den Wert für maxItemCount() auf dem Reader basierend auf einer Zählabfrage festlegen, die Sie vor dem Job ausführen (z. B. in einem Listener).