我对 Spring 的担忧 - 在阅读项目时你实际上不能 multi-thread/read 成块

My Concerns about Spring-Batch that you cant actually multi-thread/read in chunks while reading items

我正在尝试批处理简单文件。我知道我不能多线程。所以至少我试着在增加块参数的同时表现得更好:

@Bean
    public Step processFileStep() {
        return stepBuilderFactory.get("processSnidFileStep")
                .<MyItem, MyItem>chunk(10)
                .reader(reader())
   ....

我的逻辑需要处理器 'filter' 我们的无效记录。 但是我发现处理器无法获取块..但一次只能获取一个项目:

public interface ItemProcessor<I, O> {

    O process(I item) throws Exception;
}

在我的例子中,我需要访问数据库并在那里验证我的记录。所以对于每个项目我都必须查询数据库(而不是用一堆项目一起做)

我不能多线程或使我的进程性能更好?我在这里错过了什么?从文件中一条一条地处理每条记录将花费太长时间。

谢谢。

在 Spring 面向块的批处理架构中,您可以访问完整记录块的唯一组件是 ItemWriter

因此,如果您想进行任何类型的批量处理,您通常会在这里进行。使用 ItemWriteListener#beforeWrite 或实现您自己的自定义 ItemWriter.

根据过去的讨论,CSV reader 可能存在严重的性能问题。使用另一个 CSV 解析器编写 reader 可能会更好。

根据您的验证数据,您可以创建一个作业范围的过滤器 bean,它包装一个可以非常快速地预加载或延迟加载的 Map。通过这种方式,您可以将对数据库的命中限制为初始化或首次引用(分别),并将过滤时间减少到 hashmap 后备。