我有一个包含数百万条记录的数据库。我使用spring jpa访问数据库。现在,当我尝试在该表上使用findAll()时,我得到了内存错误。该表的大小约为150mb,我给了1gb堆到jvm。我的问题是为什么它消耗了如此多的堆内存。 如果这不是正确的方法,我应该使用分页,然后调用垃圾收集器。
答案 0 :(得分:1)
永远不要一次性获取所有记录,以块为单位获取所有值,然后您将摆脱outofmemory问题。 Spring-data- *模块可以帮助您有效地完成它。您可以将页面作为参数传递并检索数据。
要实现的一个示例是findAll方法,该方法将pagable作为参数并返回页面。
答案 1 :(得分:0)
Spring数据模块提供了一种简单(有点天真)的方式来处理使用分页的大结果集
如果你的要求是每次只显示一小部分结果集,那么Spring分页就足够了。
如果您需要显示整个结果集(通常是日志表),请执行以下操作:
此功能允许您执行查询,并将结果用作迭代器(或多或少) 根据您定义的fetchSize,在结果集滚动期间将一点一点地加载jvm内存 使用此方法,您可以丢弃已发送到客户端的记录,仅保留最新的内存。