在 java 中读取巨大数据库表的最佳方式

Best way to read huge db tables in java

我有一个 table 的数据库,其中有数百万条记录。我正在使用 spring jpa 访问数据库。现在,当我尝试在 table 上使用 findAll() 时,出现内存错误。 table 的大小约为 150mb,我已将 1gb 堆分配给 jvm。我的问题是为什么它消耗了这么多堆内存。 如果这不是正确的方法,我应该使用分页然后调用垃圾收集器。

永远不要一次性获取所有记录,获取块中的所有值,即页面,然后您将摆脱内存不足的问题。 Spring-data-* 模块可以帮助您有效地做到这一点。您可以将页面作为参数传递并检索数据。

要实现的一个示例是 findAll 方法,该方法将 pagable 作为参数并 returns 您分页。

Spring 数据模块提供了一种使用分页处理大结果集的简单(有点幼稚)方法。
如果您的要求是每次只显示一部分结果集,那么 Spring 分页就足够了。

如果您需要显示整个结果集(通常是日志 table),您可以:

此功能让您可以执行查询,并像迭代器一样使用结果(或多或少)。
jvm内存会在结果集滚动的过程中,根据你定义的fetchSize一点点加载。
使用此方法,您可以丢弃已发送给客户端的记录,只保留内存中的最新记录。