问题是这样的。
形成一个应用程序,我得到大约 2,00,000 个加密值任务
- 读取一个 Vo /list 中的所有加密值
- 重新格式化它添加标题/拖车。
- 将这些记录一次性转储到数据库,标题和预告片在单独的定义列中
我不想在进程之间使用任何文件 存储 2,00,000 条记录列表的最佳方式是什么,或者如何在 db 中一次性转储此记录。最好分块潜水并使用单独的线程来处理它。请为此建议一些耗时较少的解决方案。
我为此使用弹簧批处理,这个过程将是一项工作。
问题是这样的。
形成一个应用程序,我得到大约 2,00,000 个加密值任务
我不想在进程之间使用任何文件 存储 2,00,000 条记录列表的最佳方式是什么,或者如何在 db 中一次性转储此记录。最好分块潜水并使用单独的线程来处理它。请为此建议一些耗时较少的解决方案。
我为此使用弹簧批处理,这个过程将是一项工作。
Spring Batch 就是为了做这种类型的操作。您将需要一个块 tasklet。这种类型的 tasklet 使用读取器、项目处理器和写入器。此外,这种类型的 tasklet 使用流式传输,因此您永远不会一次将所有项目都放在内存中。
我不确定您的数据的传入格式,但几乎所有用例都有现有的阅读器。如果你找不到你需要的类型,你可以创建自己的。然后,您将需要实施ItemProcessor
以处理您需要做的任何修改。
对于写作,您可以使用JdbcBatchItemWriter
.
至于这些页眉/页脚,我需要更多详细信息。如果它们是所有记录的聚合,则需要事先处理它们。您可以将最终结果放入 ExecutionContext。
有几个通用技巧可以使批量插入更快:
考虑使用数据库的本机批量插入。
在插入记录之前,按主键上的升序对记录进行排序。
如果要插入空表,请先删除二级索引,然后重新创建它们。
不要在一个数据库事务中完成所有操作。
我不知道这些技巧如何转化为 spring-batch ......但如果他们不这样做,您可以考虑绕过 spring-batch 并直接进入数据库。