Spring 批次中的并行项目编写器
Parallel Item Writers in Spring batch
我是 Spring 批处理框架的新手。
我正在尝试使用 commit-interval=10000
在 reader 中读取大约 100 万条记录,而在 writer 中,我需要对项目列表做两件事。
- 将项目列表存储到数据库
- 将这些项目的一些信息写入平面文件。
我认为这两个任务可以 运行 并行,而不是在 writer class.
中编写顺序 java 代码
让两个编写器并行操作并完成各自任务的最佳方法应该是什么?
您有多种选择。
选项 1:
- 创建一个 select 将所有条目写入文件的步骤
- 在第一步之后创建两个并行步骤。他们都必须从同一个文件中读取。一个写入数据库,另一个写入文件
缺点:
- 如果两个并行步骤之一失败或跳过项目,则内容
文件和数据库将不一致
- 您必须创建一个额外的步骤
选项 2:
不要尝试 运行 并行写入文件和数据库,而是让你的块 运行 并行:
- 使用 SynchronizedItemStreamReader 从您的源中读取(如果您使用并行块处理,则必须使用同步 reader)
- 使用配置了db-writer和filewriter的composite writer(注意:你必须把你的filewriter包装成一个synchronizedWriter -> framework中没有class,但是原理是与 SynchronizedItemStreamReader 中使用的相同)
- 配置您的任务以并行处理步骤(设置异步任务执行器,设置节流限制)
优势:
- 如果您的数据库可以处理,您可以轻松地并行写入 10 个块
缺点:
- 如果您正在使用并行块处理,则在作业中重新启动是
不可能。这意味着,在重新启动的情况下,该步骤必须是
完全执行,这意味着您需要处理条目
已经写入 db
选项 3:
忘记并行性:写入文件比写入数据库快得多,因此开销不会产生重大影响。
只需使用配置了 db- 和文件编写器的复合编写器。
我是 Spring 批处理框架的新手。
我正在尝试使用 commit-interval=10000
在 reader 中读取大约 100 万条记录,而在 writer 中,我需要对项目列表做两件事。
- 将项目列表存储到数据库
- 将这些项目的一些信息写入平面文件。
我认为这两个任务可以 运行 并行,而不是在 writer class.
中编写顺序 java 代码让两个编写器并行操作并完成各自任务的最佳方法应该是什么?
您有多种选择。
选项 1:
- 创建一个 select 将所有条目写入文件的步骤
- 在第一步之后创建两个并行步骤。他们都必须从同一个文件中读取。一个写入数据库,另一个写入文件
缺点:
- 如果两个并行步骤之一失败或跳过项目,则内容 文件和数据库将不一致
- 您必须创建一个额外的步骤
选项 2:
不要尝试 运行 并行写入文件和数据库,而是让你的块 运行 并行:
- 使用 SynchronizedItemStreamReader 从您的源中读取(如果您使用并行块处理,则必须使用同步 reader)
- 使用配置了db-writer和filewriter的composite writer(注意:你必须把你的filewriter包装成一个synchronizedWriter -> framework中没有class,但是原理是与 SynchronizedItemStreamReader 中使用的相同)
- 配置您的任务以并行处理步骤(设置异步任务执行器,设置节流限制)
优势:
- 如果您的数据库可以处理,您可以轻松地并行写入 10 个块
缺点:
- 如果您正在使用并行块处理,则在作业中重新启动是 不可能。这意味着,在重新启动的情况下,该步骤必须是 完全执行,这意味着您需要处理条目 已经写入 db
选项 3:
忘记并行性:写入文件比写入数据库快得多,因此开销不会产生重大影响。
只需使用配置了 db- 和文件编写器的复合编写器。