【问题标题】:Spring Batch: migrating 1 to n relationship where n is potentially hugeSpring Batch:迁移 1 到 n 关系,其中 n 可能很大
【发布时间】:2010-08-20 08:21:47
【问题描述】:

我对 Spring 很熟悉,但对 Spring Batch 很陌生。现在我的任务是将数据结构从一个数据库中的简单结构迁移到另一个数据库中的复杂结构。数据结构对应于我将这样命名的对象层次结构

OldParent 1 --> n OldChild // old system

NewParent 1 --> n NewChild // new system

在旧数据库中,只有两个表,在新系统中,事情变得更加复杂,有 8 个表,但现在无关紧要。

基本上我想使用一个简单的基于 JDBC 的解决方案,其中行映射器从 OldParent 读取并转换为 NewParent。

所以这里将是一个基本的配置 sn-p:

<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 对象并写入 NewParent,委托给 parentReader 和 parentWriter 对象。这里的主要缺点是我丢失了所有没有关联 OldChild 对象的 OldParents。

第三种可能的情况是为OldParent -&gt; NewParentOldChild -&gt; NewChild 设置两个不同的工作流。 (我必须维护一个映射表来存储 OldParent 和 NewParent id 之间的关系,但我可以使用标准配置,包括 commit-interval。

还有其他可能性吗?您会推荐以下哪一项作为最佳做法?

【问题讨论】:

    标签: java spring jdbc data-migration spring-batch


    【解决方案1】:

    它没有 N-records commit-interval 配置吗?它不是使用 BatchUpdates (JDBC) 之类的东西,因此您可以配置 N 大小的批量更新和每个批量更新的提交。

    如果没有,我有 hack :)

    制作您自己的 java.sql.Connection 实现。一个将所有命令传递给原始连接,并且在每次第 N 次更新后执行一次提交... :)

    如果您使用的是 DatabasePool,您也可以包装原件,以返回与 hack 的包装连接。

    我知道这是一个有点奇怪的提议……但也许这就是一次性迁移所需要的全部内容。

    【讨论】:

    • 虽然您的第 3 段肯定是在不存在标准配置选项时做事的一种方式,但我想保持春季批处理标准并尽可能使用 commit-interval 属性,所以我正在寻找对于可以归类为春季批处理最佳实践的解决方案,而不是 hack(即使我同意它可能适用于一次性任务)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-20
    • 1970-01-01
    • 2019-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多