我对 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 对象,可能委托(delegate)给 childReader/childWriter 对象。
问题是这样的:虽然有几十万个父级,但每个父级可以有零到几百万个子级,所以基于父级的提交间隔根本无济于事,但我非常希望有一个可配置的提交间隔。
所以另一种解决方案是使工作流基于 child :
<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,委托(delegate)给 parentReader 和 parentWriter 对象。这里的主要缺点是我丢失了所有没有关联的 OldChild 对象的 OldParents。
第三种可能的情况是为 OldParent -> NewParent
和 OldChild -> NewChild
使用两个不同的工作流。 (我必须维护一个映射表来存储 OldParent 和 NewParent id 之间的关系,但我可以使用包括提交间隔在内的标准配置。
还有其他可能吗?您会推荐以下哪些最佳做法?
最佳答案
它没有 N 记录提交间隔配置吗?它不使用 BatchUpdates (JDBC) 之类的东西,因此您可以配置 N 大小的批量更新并为每个 batchupdate 提交一次。
如果没有,我有一个 hack :)
制作您自己的 java.sql.Connection 实现。将所有命令传递给原始连接并加上,在每次第 N 次更新后执行提交...:)
如果您使用的是 DatabasePool,您也可以包装原始数据,以返回与 hack 的包装连接。
我知道这是一个有点奇怪的提议...但也许这就是一次性迁移所需的全部内容。
关于java - Spring 批处理 : migrating 1 to n relationship where n is potentially huge,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3529254/