决定是Spring Batch Step、Tasklet还是Chunk [英] Deciding between Spring Batch Step, Tasklet or Chunks
本文介绍了决定是Spring Batch Step、Tasklet还是Chunk的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有一个简单的要求,我需要(从数据库)读取项目列表,并需要处理这些项目,一旦处理完毕,就必须将其更新到数据库中。
我正在考虑将Spring Batch块与阅读器、处理器和编写器一起使用。我的阅读器将从列表中一次返回一项,并将其发送到处理器,一旦处理结束,它将返回到Writer,在那里它更新数据库
稍后我可能会对其进行多线程处理,但这些方法需要一些同步开销。
在这里我预见到几个问题。
- 要处理的项目数可能更多。可能在10,000或更多。
- 处理器需要进行一些逻辑计算。因此,一次处理一个项目。即使是具有10个线程的多线程,也无法确定性能。
- 编写器可以更新数据库中该已处理项目的结果。不确定如何进行批量更新,因为它始终只有1个项目已处理并准备就绪。
对于这种用例,这种方法正确吗?或者可以做更好的事情? 有没有其他方法可以一次调用阅读器、处理机和编写器来处理一堆项目?如果是这样的话,我是否需要创建一些机制,比如从列表中提取10个项目并将其提供给处理器? 似乎写入器会在记录到来时更新每个记录,批量更新只有在写入器收到一堆已处理的项目时才有意义。有什么建议吗?
请注意此设计以获得更好的性能。
谢谢,
推荐答案
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>
假设您的读者将调用返回10000条记录的SELECT语句。并将提交间隔设置为500。
MyReader将调用read()方法500次。假设在现实中,读取器实现实际上可能会从ResultSet中删除项。对于每个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;
}
您可以看到写入器收到一个项目列表。此列表将是您的提交间隔的大小(如果到达末尾,则小于此大小)
顺便说一句,10000条记录不算什么。如果您必须处理数百万条记录,可以考虑使用多线程。但即便如此,只需调整一下提交间隔值的最佳位置可能就足够了。希望能有所帮助
这篇关于决定是Spring Batch Step、Tasklet还是Chunk的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文