我正在使用Spring Batch编写批处理。我必须将大约2 000 000条记录从数据源(Oracle数据库)移动到目标(Kafka代理)。我在犹豫要为这份工作选择哪个ItemReader:
JdbcCursorItemReader :如果我理解正确的话会打开游标,它将逐个遍历所有这些记录的ResultSet,性能没有问题;在数据库数据库下保存满足查询执行时 where 子句的记录快照;
RepositoryItemReader :可能性能较差,基于分页机制进行分区,对于每个页面执行查询,可以省略一些可以在获取2时写入数据库的记录000 000条记录,在前一种情况下不会发生(我的推理是否正确?)
总结:因此,我希望以分区方式发送所有这些2 000 000条记录,就像它们在执行查询时一样。我是否在思考这个问题?在将来执行更新作业的情况下,跳过新记录可能不是一个问题吗?或者我对RepositoryItemReader的推理不正确?
答案 0 :(得分:0)
长时间保持光标打开并不总是理想的。根据您使用的数据库,可能无法优化;即一些数据库不尊重fetchSize,并会在请求时逐个检索结果。
我会使用RepositoryItemReader或其中一个PagingItemReader实现。
如果您担心或不想省略新记录,我不会完全关注。
如果您想要省略新记录,您应该能够在where子句中添加谓词,以便不传递某个ID或时间戳字段。如果这些都不可用,您可以根据您在作业之前预先执行的计数查询(例如,在侦听器中)在阅读器上设置maxItemCount()。