我需要从数据库中提取数百万个数据到GSP页面,我编写了类似的查询
"select * from tablename";
现在,如果我上传的内容多于显示错误的内容,则一次只能检索一千行
java.lang.OutOfMemoryError: GC overhead limit exceeded
我没有使用休眠模式。如何在Grails项目中获取大量数据?
最佳答案
您有2个选项:使用分页或使用查询结果迭代器。
如果您使用的是Grails,我建议您使用Hibernate,它允许您创建SQL查询而不用手工编写它们,并且可以处理与安全性有关的所有问题。此外,请限制您的请求:*
并非总是必需的,并且可以节省请求时间/内存。
分页
这是处理大量数据的最佳方法:您只需要将查询拆分为子查询,即可返回已知的行数。为此,您必须使用SQL闭包LIMIT
和OFFSET
。
例如,您的查询可能是:select * from tablename LIMIT 100 OFFSET 2000
。您只需要更改OFFSET
参数即可检索所有值。
因此,您的后端将不必一次处理大量数据。此外,您可以使用Javascript在呈现先前结果的同时将请求发送至后端,从而缩短了响应时间(例如,异步滚动的工作原理如下)。
Grails具有默认的分页系统,您可以按原样使用。请查看官方文档here。如果您不使用Hibernate,也许您需要对其进行一些调整。
查询结果迭代器
您可以通过对结果使用迭代器来处理大量数据,但这取决于查询框架。此外,使用这种方法,您将生成巨大的HTML页面,其中的大小可能是个问题(请记住:您有一个OutOfMemory,因此您谈论的是数百或数千个Mo;一次,用户将必须下载他们同步!)
关于postgresql - 从gsp中的数据库(postgresql)检索一百万个数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38540367/