【问题标题】:Spring Batch JdbcCursorItemReader or RepositoryItemReader?Spring Batch JdbcCursorItemReader 还是 RepositoryItemReader?
【发布时间】:2017-11-27 19:01:42
【问题描述】:

我正在使用 Spring Batch 编写批处理。我必须将大约 2 000 000 条记录从数据源(Oracle 数据库)移动到目标(Kafka 代理)。我正在犹豫我应该为这份工作选择哪个 ItemReader:

  • JdbcCursorItemReader:如果我理解正确它会打开游标,游标会逐一遍历所有这些记录的ResultSet,性能没有问题;后台数据库会在查询执行时保留满足 where 子句的记录的快照;

  • RepositoryItemReader:可能性能较低,基于分页机制的分区,对于将执行查询的每个页面,可能会在 2 提取期间省略一些可能写入数据库的记录000 000 条记录,在前一种情况下不会发生(我的推理是否正确?)

总结:因此,我想以分区方式发送查询执行时的所有这 2 000 000 条记录。我是不是在想这个问题?在将来执行更新作业的情况下,跳过新记录可能不是问题?或者我对 RepositoryItemReader 的推理不正确?

【问题讨论】:

    标签: java spring jdbc spring-batch partitioning


    【解决方案1】:

    长时间保持光标打开并不总是理想的。根据您使用的数据库,它可能未优化;即,一些数据库不支持 fetchSize 并且会根据请求一一检索结果。

    我会使用 RepositoryItemReader 或 PagingItemReader 实现之一。

    如果您关心的是您愿意或不希望忽略新记录,我并不十分关注。

    如果您确实想省略新记录,您应该能够在 where 子句中添加一个谓词,以不传递某个 ID 或时间戳字段。如果这些都不可用,您可以根据您在作业之前执行的计数查询(例如,在侦听器中)在阅读器上设置 maxItemCount()。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-27
      • 2014-03-15
      相关资源
      最近更新 更多