我对 Spring 批处理框架相当陌生。
我正在尝试使用 commit-interval=10000
在阅读器中读取大约 100 万条记录,在编写器中我需要对项目列表执行 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/