3

私はSpringの経験がありますが、SpringBatchは初めてです。これで、データ構造を1つのデータベースの単純な構造から別のデータベースのより複雑な構造に移行するタスクがあります。データ構造は、このように名前を付けるオブジェクト階層に対応しています

OldParent 1 --> n OldChild // old system

NewParent 1 --> n NewChild // new system

古いデータベースではテーブルが2つしかなく、新しいシステムでは状況がさらに複雑になり、テーブルが8つありますが、今のところそれは関係ありません。

基本的に、行マッパーがOldParentから読み取り、NewParentに変換する単純なJDBCベースのソリューションを使用したいと思います。

したがって、基本的な構成スニペットは次のようになります。

<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オブジェクトに委任します。

問題はこれです。数十万の親がありますが、各親は0から数百万の子を持つことができるため、親に基づくコミット間隔はまったく役に立ちませんが、構成可能なコミット間隔が必要です。

したがって、別の解決策は、ワークフローを子ベースにすることです。

<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オブジェクトに委任する必要があります。ここでの主な欠点は、OldChildオブジェクトが関連付けられていないすべてのOldParentを失うことです。

OldParent -> NewParent3番目に考えられるシナリオは、との2つの異なるワークフローを持つことOldChild -> NewChildです。(OldParentIDとNewParentIDの間の関係を格納するマッピングテーブルを維持する必要がありますが、commit-intervalを含む標準構成を使用できます。

他の可能性はありますか?これらのうち、ベストプラクティスとして推奨するものはどれですか。

4

1 に答える 1

0

Nレコードのコミット間隔構成はありませんか?BatchUpdates(JDBC)のようなものを使用していないので、Nサイズのバッチ更新と各batchupdateのコミットを構成できます。

それがない場合はハックがあります:)

独自のjava.sql.Connection実装を作成します。すべてのコマンドを元の接続に渡し、さらにN回目の更新ごとにコミットを実行するもの... :)

DatabasePoolを使用している場合は、元のファイルをラップして、ハックでラップされた接続を返すこともできます。

少し奇妙な提案だと思いますが、1回限りの移行に必要なのはそれだけかもしれません。

于 2010-08-20T10:32:02.877 に答える