java - Spring 批处理中的并行项目编写器

标签 java parallel-processing spring-batch scalability

我对 Spring 批处理框架相当陌生。

我正在尝试使用 commit-interval=10000 在阅读器中读取大约 100 万条记录,在编写器中我需要对项目列表执行 2 件事。

  1. 将项目列表存储到数据库
  2. 将这些项目中的一些信息写入平面文件。

我认为这两个任务可以并行运行,而不是在编写器类中编写顺序java代码。

让两个编写器并行操作并完成自己的任务的最佳方式应该是什么?

最佳答案

您有多种选择。

选项 1:

  • 创建一个选择步骤,将所有条目写入文件
  • 在第一个步骤之后创建两个并行步骤。他们都必须从同一个文件中读取。一个写入数据库,另一个写入文件

缺点:

  • 如果两个并行步骤之一失败或跳过项目,则内容 文件和数据库将不一致
  • 您必须创建一个额外的步骤

选项2:
不要尝试并行运行对文件和数据库的写入,而是让 block 并行运行:

  • 使用 SynchronizedItemStreamReader 从源中读取(如果您使用并行 block 处理,则必须使用同步读取器)
  • 使用配置有db-writer和filewriter的复合写入器(注意:你必须将文件写入器包装到synchronizedWriter中 -> 框架中没有此类,但原理与SynchronizedItemStreamReader中使用的相同)
  • 配置您的任务以并行处理步骤(设置 asynctaskexecutor、设置 throttle 限制)

优点:

  • 如果您的数据库可以处理,您可以轻松并行写入 10 个 block

缺点:

  • 如果您使用并行 block 处理,则在作业内重新启动是 不可能。这意味着,如果重新启动,该步骤必须是 完全执行,这意味着您需要处理条目 已经写入数据库

选项3:
忘记并行性:写入文件比写入数据库快得多,因此开销不会产生重大影响。 只需使用配置了数据库和文件写入器的复合写入器即可。

关于java - Spring 批处理中的并行项目编写器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39629012/

相关文章:

java - 当有线程调度程序时,执行线程如何并发运行?

c - 如何使用 MPI_Abort() 终止其他处理器

c++ - bool 乘法

java - 生成字符串所有组合的算法

java - 如何提高我的应用程序的速度?

linker - MPI 和 D : Linker Options

spring - 如何在 Spring Batch 中分别读取平面文件头和正文

java - 如何使用 Spring Batch 并行步骤分割流配置上述用例?

java - 如何使用作业参数替换从文件加载 bean 值?

java - 如何在netbeans中逐行查看执行路径?