0

我有一个简单的 csv 文件,我正在读取 1000 个块,插入到数据库中。现在,如果我想检查该行是否存在于 db 中并且在插入之前是否等于输入,如果存在并且行是否相等-忽略,否则插入或更新,我正在使用 ItemProcessor。实现此之后,意识到 jdbc 调用太慢(平均 120 毫秒),并且想在调用 db 之前对 id 进行批处理并检查输入。在这个阶段,ItemReader 一次将一个项目传递给 ItemProcessor。现在我试图一次将 1000 个项目传递给 ItemProcessor,以便可以对 jdbc 调用进行批处理。在尝试此操作时,能够检查一些示例但无法让读者工作。这是示例代码。

public class customReader implements ItemReader<List<T>> {
private static List<T> records = null;
ItemReader<String> itemReader;

@Autowired customDao customDao; 
private int index = 0; 
@Override public List<T> read() throws Exception {
//reader logic
//while(records.size() < 1000){
      String record = itemReader.read();
      if(Objects.isNull(record)){
          break;
      } 
      records.add(record);
 }
 return (List<T>) records;

}

这是配置

@Bean
    return stepBuilderFactory
            .get("step")
            .<List<String>, List<String>>chunk(1000)
            .reader(reader())
            .processor(processor())
            .writer(writer())
            .build();

如果有人有一个简单的示例,他们可以将 1000 行 csv 文件的列表传递给处理器,请分享示例。检查了共享的示例:使项目阅读器返回列表而不是单个对象-Spring批处理 获取异常,未经检查的对处理器的调用,编写器等。

Spring Batch - Item Reader 和 ItemProcessor 以及上面检查过的列表,但有例外,如评论中列出的和未检查的类型等。如果您有阅读器、处理器和编写器的工作示例,在一个事务中没有多行,请分享穿线。

4

1 回答 1

0

从这个问题看来,您在使用自定义 ItemReader 阅读列表时遇到问题(如果有任何其他问题,请纠正我)。首先,您可以发布 ItemProcessor 和 ItemWriter 的结构,这将有助于获得更多信息问题的洞察力。

只是为了更清楚地了解春季批处理的工作原理,您使用阅读器一次读取一个或多个项目。但是,批处理框架一次将一个项目发送到处理器(即使它已经通过批量读取准备了一个项目列表) 并且 writer 将接收来自处理器的输出列表以写入目标(基于块大小)。如果您正在从 reader 读取 List 并从 reader 返回相同的列表,则处理器将接收该 List 以进行处理,但 writer 应该具有 List<List>来写。在某种程度上,批处理会将您已读取并传递给处理器的 List 视为 1 个单个项目并基于块大小,如果它是 10(假设),它将在其他列表中添加 10 个 List 并发送该 List<List>给作家。

于 2022-02-02T15:37:57.647 回答