代码之家  ›  专栏  ›  技术社区  ›  Sean Patrick Floyd

Spring批处理:迁移1到n的关系,其中n可能很大

  •  3
  • Sean Patrick Floyd  · 技术社区  · 14 年前

    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对象。这里的主要缺点是我丢失了所有没有关联OldChild对象的OldParents。

    OldParent -> NewParent OldChild -> NewChild . (我必须维护一个映射表来存储OldParent和NewParent id之间的关系,但是我可以使用包括commit interval在内的标准配置。

    1 回复  |  直到 14 年前
        1
  •  0
  •   helios    14 年前

    它没有N记录提交间隔配置吗?它不是使用了BatchUpdates(JDBC)之类的东西吗?这样您就可以为每个batchupdate配置N个大小的批更新和一个提交。

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

    如果您使用的是数据库池,那么也可以包装原始数据库池,以返回与hack的包装连接。

    我知道这有点奇怪。。。但也许这就是一次性迁移所需要的。