我对 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 后备。
我正在尝试批处理简单文件。我知道我不能多线程。所以至少我试着在增加块参数的同时表现得更好:
@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 后备。