Spring 批次中的并行项目编写器

Parallel Item Writers in Spring batch

我是 Spring 批处理框架的新手。

我正在尝试使用 commit-interval=10000 在 reader 中读取大约 100 万条记录,而在 writer 中,我需要对项目列表做两件事。

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

我认为这两个任务可以 运行 并行,而不是在 writer class.

中编写顺序 java 代码

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

您有多种选择。

选项 1:

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

缺点:

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

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

  • 使用 SynchronizedItemStreamReader 从您的源中读取(如果您使用并行块处理,则必须使用同步 reader)
  • 使用配置了db-writer和filewriter的composite writer(注意:你必须把你的filewriter包装成一个synchronizedWriter -> framework中没有class,但是原理是与 SynchronizedItemStreamReader 中使用的相同)
  • 配置您的任务以并行处理步骤(设置异步任务执行器,设置节流限制)

优势:

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

缺点:

  • 如果您正在使用并行块处理,则在作业中重新启动是 不可能。这意味着,在重新启动的情况下,该步骤必须是 完全执行,这意味着您需要处理条目 已经写入 db

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