【发布时间】:2019-12-26 01:15:03
【问题描述】:
我有一个带有JpaPagingItemReader 的Spring Batch 应用程序(我对其进行了一些修改)和4 个Jpa 存储库以丰富来自JpaPagingItemReader 的Model。
我的流程是:
- 选择
Model(页面大小=8192),然后我收集这个List<Model> to Map<String, List<Model>>(按id分组,因为模型不是唯一的,我需要按id丰富)然后用4丰富它使用带有 IN 子句的本机查询自定义JpaRepositories,并将它们与Java 8 Streams合并。 - 将数据转换为 XML 对象,并使用 Stax 将
MultiFileItemWriter写入文件,每个文件拆分不超过20000。
一切都很好,但今天我尝试使用来自数据库的大量数据运行流程。我生成了 20 个文件 (2.2 GB)。但有时我得到OutOfMemory Java Heap(我有 1Gb XMS、XSS),然后我将它提高到 2 GB,一切正常,但在 Instana 中我看到,Old gen Java memory 在 GC 之后总是在使用900。使用中约为 1.3-1.7Gb。所以我开始思考,如何优化 Spring Data Jpa 对象的 GC。我认为他们有很多时间在记忆中。
当我选择带有JpaPagingItemReader 的模型时,我会分离每个模型(带有entityManager.detach),但是当我使用自定义Spring Data Jpa 请求丰富Model 时,我不会分离结果。也许这是问题所在,我应该将它们分开?
我不需要将数据插入数据库,我只需要读取它。还是我需要缩小页面大小并为每个请求选择大约 4000?
我需要处理数据库中的 370 000 条记录并丰富它们。
【问题讨论】:
-
您应该将它们分成更小的部分,而不是将它们全部放入内存中。与其将 370K 记录读入内存,不如将 1K 读入内存,丰富它们(无论这意味着什么),然后循环直到处理完所有必要的记录。
-
我使用分页阅读器并阅读每 8k 个项目
标签: spring-boot docker spring-data-jpa garbage-collection