Spring Batch 是满足您需要的完美工具。
面向块的步骤允许您使用 commit-interval 属性配置要读取/处理/写入的项目数量。
<batch:step id="step1" next="step2">
<batch:tasklet transaction-manager="transactionManager" start-limit="100">
<batch:chunk reader="myReader" processor="myProcessor" writer="MyWriter" commit-interval="800" />
<batch:listeners>
<batch:listener ref="myListener" />
</batch:listeners>
</batch:tasklet>
</batch:step>
假设您的读者将调用返回 10 000 条记录的 SELECT 语句。然后你设置了一个 commit-interval=500。
MyReader 将调用 read() 方法 500 次。假设实际上,阅读器实现实际上可能会从结果集中删除项目。对于每次调用 read(),它还会调用 MyProcessor 的 process() 方法。
但在达到提交间隔之前,它不会调用 MyWriter 的 write() 方法。
如果看一下接口ItemWriter的定义:
public interface ItemWriter<T> {
/**
* Process the supplied data element. Will not be called with any null items
* in normal operation.
*
* @throws Exception if there are errors. The framework will catch the
* exception and convert or rethrow it as appropriate.
*/
void write(List<? extends T> items) throws Exception;
}
您会看到 write 收到一个项目列表。该列表将是您的提交间隔的大小(如果达到结尾,则更少)
顺便说一句,10 000 条记录算不了什么。如果您必须处理数百万条记录,您可以考虑使用多线程。但即便如此,仅仅使用提交间隔值的最佳位置可能就足够了。
希望能帮助到你