Spring Batch: перенос отношения 1 к n, где n потенциально огромно - PullRequest
3 голосов
/ 20 августа 2010

У меня есть опыт работы с 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, но я мог бы использовать стандартные конфигурации, включая интервал фиксации.

Существуют ли другие возможности? Какие из них вы бы порекомендовали в качестве наилучшей практики?

1 Ответ

0 голосов
/ 20 августа 2010

Разве у него нет конфигурации интервала фиксации N-записей?Разве он не использует что-то вроде BatchUpdates (JDBC), чтобы вы могли настраивать пакетные обновления N-размера и фиксировать для каждой пакетной даты.

Если нет, у меня есть хакСделайте свою собственную реализацию java.sql.Connection.Тот, который передает все команды исходному соединению и плюс, выполняет коммит после каждого N-го обновления ...:)

Если вы используете DatabasePool, вы можете также обернуть оригинал, чтобы вернутьзавернутая связь с хаком.

Я знаю, что это немного странное предложение ... но, возможно, это все, что вам нужно для разовой миграции.

...