У меня есть опыт работы с Spring, но я новичок в Spring Batch.Теперь у меня есть задача перенести структуру данных из простой структуры в одной базе данных в более сложную в другой.Структура данных соответствует иерархии объектов, которую я назову следующим образом:
OldParent 1 --> n OldChild // old system
NewParent 1 --> n NewChild // new system
В старой базе данных есть только две таблицы, в новой системе все становится намного сложнее, и есть 8 таблиц, но сейчас это не имеет значения.
В основном я хотел бы использовать простое решение на основе JDBC с считывателями строк из OldParent и преобразованием в NewParent.
Так что здесь будет базовый фрагмент конфигурации:
<batch:job id="migration">
<batch:step id="convertLegacyData">
<batch:tasklet>
<batch:chunk
reader="parentReader"
writer="parentWriter"
commit-interval="200" />
</batch:tasklet>
</batch:step>
</batch:job>
В этом сценарии parentReader получит и преобразует объекты OldChild, вероятно, делегируя их объектам childReader / childWriter.
Проблема заключается в следующем: хотя существует несколько сотен тысячРодители, каждый родитель может иметь от нуля до нескольких миллионов детей, поэтому интервал коммитов, основанный на родителе, совсем не поможет, но я бы очень хотел иметь настраиваемый интервал коммитов.
Так что другое решение будетсделать рабочий процесс дочерним:
<batch:job id="migration">
<batch:step id="convertLegacyData">
<batch:tasklet>
<batch:chunk
reader="childReader"
writer="childWriter"
commit-interval="200" />
</batch:tasklet>
</batch:step>
</batch:job>
В этом сценарии childReader также должен читать объекты OldParent и записывать NewParents, делегируя объектам parentReader и parentWriter.Основным недостатком здесь является то, что я теряю всех OldParent, у которых нет связанных объектов OldChild.
Третий возможный сценарий - это два разных рабочих процесса для OldParent -> NewParent
и OldChild -> NewChild
.(Мне бы пришлось вести таблицу сопоставления, в которой хранятся отношения между идентификаторами OldParent и NewParent, но я мог бы использовать стандартные конфигурации, включая интервал фиксации.
Существуют ли другие возможности? Какие из них вы бы порекомендовали в качестве наилучшей практики?