jpa 并行处理而不是交互器,forEachRemaining?

pb3skfrl  于 2023-06-23  发布在  其他
关注(0)|答案(1)|浏览(104)

我有一段代码,它从数据库中获取20万个条目,然后批量处理。我注意到的是processBatch(每批处理5000个条目)需要大约3分钟来处理(基本上需要2小时处理)
我已经在为entryId的数据库使用索引来加快查找条目的速度。我想知道的是,是否有可能有这种批处理以某种方式并行运行。
如果不清楚,我会很乐意重构这个问题

Stream<X> streams= repository
                .streamBySourceFileCreationDate(getDateFromFilename(sourceFileName));

        int batchSize = properties.getBuildOutput().getSize();
        List<OutX> built = new ArrayList<>();

        Iterators.partition(streams.iterator(), batchSize)
                .forEachRemaining(list -> processBatch(list, built));
private void processBatch(List<X> list, List<OutX> built) {
        list.stream().map(m -> {
                X xEntry = repository
                        .findLatestUpdateById(m.getEntryId());
                if (xEntry == null) {
                    return null;
                }
                XOut out = buildXOut(x);
                return out;
        }).filter(Objects::nonNull).forEach(built::add);
}
j2cgzkjk

j2cgzkjk1#

许多可能的选择之一:

List<X> readIn = repository.findBySourceFileCreationDate(getDateFromFilename(sourceFileName));
List<OutX> built = readIn.parallelStream()
    .map(m -> 
        {
          X xEntry = repository.findLatestUpdateById(m.getEntryId());
          if (xEntry == null) {
            return null;
          }
          return buildXOut(x);
        })
    .filter(Objects::nonNull)
    .collect(Collectors.toList());

相关问题