首页 > 解决方案 > 哪个 Spring Batch Partition 最适合

问题描述

我有一个有大约 400k 记录的数据库,并且使用 Spring Batch 我需要将它迁移到另一个数据库。使用单线程步骤可能不会给我带来性能优势,因此考虑使用 spring batch 提供的可扩展性选项。

在阅读了多篇文章和文档后,我了解到以下是优化批处理作业的方法。

  1. 多线程步骤:如果您需要重试功能,那就不好了
  2. AsyncItemProcessor/AsynItemWriter :不适合我的用例,因为阅读器也需要并行工作
  3. 分区:考虑使用本地分区作为远程需要入站/出站通道。
  4. 远程分块:由于额外的复杂性,不想使用它

请为我的用例建议最佳方法。

我正在考虑使用本地分区。但是,由于 id 列是 varchar,我无法理解如何对其进行分区,并且 spring 批处理示例显示了 ColumnRangePartitioner 的示例,其中列是数字 id。

gridSize 是否代表将产生的从属线程的数量?如果是,我想使用 Runtime.getRuntime().availableProcessors()+1 使其动态化。这是 I/O 作业的正确方法吗?

标签: spring-bootspring-batch

解决方案


gridSize 是否代表将产生的从属线程的数量?

不必要。网格大小是将由分区程序创建的分区数。请注意,这只是对分区器的提示,一些分区器不使用它(如MultiResourcePartitioner)。

这与工人的数量不同。您可以拥有比工作人员更多的分区,反之亦然。

如果是,我想使用 Runtime.getRuntime().availableProcessors()+1 使其动态化。

您可以使用Runtime.getRuntime().availableProcessors()动态生成与可用内核一样多的工作人员(即使我看不到添加 1 的价值,除非我遗漏了什么)。

这是 I/O 作业的正确方法吗?

这取决于您如何处理每条记录。但我认为这是一个好的开始,因为每个工作人员将处理不同的分区,并且所有工作人员都可以并行执行。


推荐阅读