Java 处理大量数据

Java 处理大量数据,java,spring-batch,Java,Spring Batch,问题是这样的 从一个应用程序中,我得到大约200000个加密值 任务 读取一个Vo/列表中的所有加密值 重新格式化,添加收割台/拖车 将这些记录一次转储到DB,标题和尾声以单独的列显示 我不想在进程之间使用任何文件 存储200000条记录列表之类的东西的最佳方式是什么 如何在db中一次性转储此记录。最好分成几块,使用单独的线程来处理它。 请为这个问题提出一些不太耗时的解决方案 我使用spring批处理来完成此任务,此过程将是一项工作。有两个通用技巧可以加快批量插入速度: 考虑使用数据库的本机大

问题是这样的

从一个应用程序中,我得到大约200000个加密值 任务

  • 读取一个Vo/列表中的所有加密值
  • 重新格式化,添加收割台/拖车
  • 将这些记录一次转储到DB,标题和尾声以单独的列显示
  • 我不想在进程之间使用任何文件 存储200000条记录列表之类的东西的最佳方式是什么 如何在db中一次性转储此记录。最好分成几块,使用单独的线程来处理它。 请为这个问题提出一些不太耗时的解决方案


    我使用spring批处理来完成此任务,此过程将是一项工作。

    有两个通用技巧可以加快批量插入速度:

    • 考虑使用数据库的本机大容量插入

    • 在插入记录之前,按主键的升序对记录进行排序

    • 如果要插入空表,请先删除辅助索引,然后重新创建它们

    • 不要在一个数据库事务中完成所有操作


    我不知道这些技巧在spring batch中的效果如何。。。但如果没有,可以考虑绕过弹簧批并直接进入数据库。您将需要一个块tasklet。这种类型的tasklet使用读卡器、项处理器和写入器。此外,这种类型的tasklet使用流式处理,因此您永远不会同时在内存中保存所有项

    我不确定数据的传入格式,但几乎任何用例都有现有的阅读器。如果找不到所需的类型,可以创建自己的类型。然后,您将需要实现
    ItemProcessor
    ,以处理需要进行的任何修改

    对于编写,只需使用
    jdbccbatchitemwriter


    至于这些页眉/页脚,我需要更多的细节。如果它们是所有记录的集合,则需要事先处理它们。您可以将最终结果放入ExecutionContext。

    使用200000您是指200万吗?你的第一个方法是什么?优化的潜在机会很多。当然,直到你知道你所拥有的东西在哪里是次优的以及为什么,最初的建议可能是完全错误的…@Marco它大约有20万条记录。第一种方法是存储在数组列表中,然后使用一个VO重新格式化,并将其分块写入db。您必须一次读取所有记录吗?是的,这是一次作业。一个shell脚本将触发作业,它将一次读取所有记录,重新格式化并将其写入db.ya页眉/页脚,以聚合所有记录。所以我想我可以使用tasklet reader作为前一步和后一步。@popats。我不确定一个听者会为你做什么。你在用页眉/页脚数据做什么?根据您的性能要求,在自己的步骤中进行页眉/页脚处理可能更容易。页眉/页脚数据将包含有关我正在接收的数据的元数据,这些数据也需要转储到数据库中。