从gsp中的数据库(postgresql)中检索一百万个数据

时间:2016-07-23 09:45:09

标签: postgresql grails

我需要从数据库中获取数百万个数据到GSP页面,我写了像

这样的查询
"select * from tablename";

现在,如果我上传的内容多于显示

之类的错误,则一次只能检索到一千行
java.lang.OutOfMemoryError: GC overhead limit exceeded

我没有使用hibernate。如何在grails项目中获取大量数据?

1 个答案:

答案 0 :(得分:0)

您有两种选择:使用分页或使用查询结果迭代器

如果您正在使用Grails,我建议您使用Hibernate,它允许您创建SQL查询而无需手动编写,并将处理与安全性相关的所有问题。更重要的是,对您的请求有限制:*并不总是必要的,可以节省请求时间/内存。

分页

这是处理大量数据的最佳方法:您只需在子查询中拆分查询,返回已知数量的行。为此,您必须使用SQL闭包LIMITOFFSET

例如,您的查询可能是:select * from tablename LIMIT 100 OFFSET 2000。您只需更改OFFSET参数即可检索所有值。

多亏了这一点,您的后端不必一次处理大量数据。更重要的是,您可以使用Javascript向后端发送请求,同时渲染以前的结果,这样可以缩短响应时间(异步滚动就像这样工作)

Grails有一个默认的分页系统,您可以使用"原样"。请查看官方文档here。如果你不使用Hibernate,也许你必须稍微调整一下。

查询结果迭代器

您可以通过在结果上使用迭代器来处理大量数据,但这取决于查询框架。更进一步,使用这种方法,你将生成巨大的HTML页面,其中大小可能是一个问题(记住:你有一个OutOfMemory,所以你正在谈论数百或数千个Mo;同时,用户必须同步下载它们!)