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