我正在使用 groovy.sql.Sql 类来查询数据库并处理结果。我的问题是 ResultSet 可能非常大;太大了,如果我尝试一次处理整个结果集,我就会面临内存不足的风险。我知道 Sql.rows() 方法支持使用偏移量和最大结果参数进行分页,但我一直无法找到如何使用它的好例子(而且我不确定分页是我正在寻找的)。
基本上,这就是我想要做的:
def endOfResultSet = false
for(int x = 1; !endOfResultSet; x+=1000){
def result = sql.rows("Select * from table", x, 1000)
processResult(result)
endOfResultSet = result.size()!=1000
}
我的问题是 Groovy 是否足够聪明,可以为 sql.rows("Select * from table", x, 1000)
调用重用相同的结果集,或者它是否会重复运行对数据库执行相同的语句,然后分页到偏移量开始的位置。
非常感谢您的帮助,谢谢!
编辑:我试图避免的是在数据库上多次运行相同的查询。我想运行一次查询,获取前 1,000 行,处理它们,获取接下来的 1,000 行,等等......直到所有行都被处理。
最佳答案
我假设您已经看过this blog post关于分页?
为了回答你的问题,如果我们查看 Groovy 中 Sql 类的代码,我们可以看到 rows(String,int,int)
的代码来电 rows(String,int,int,null)
其代码是:
AbstractQueryCommand command = createQueryCommand(sql);
ResultSet rs = null;
try {
rs = command.execute();
List<GroovyRowResult> result = asList(sql, rs, offset, maxRows, metaClosure);
rs = null;
return result;
} finally {
command.closeResources(rs);
}
如您所见,它得到了完整的 ResultSet
,然后在 asList
method 中逐步执行此操作,填写List<GroovyRowResult>
对象仅包含您请求的结果。
编辑(编辑问题后)
正如我在下面的评论中所说,我认为您需要为您正在使用的特定数据库编写自己的分页查询...例如,with MySQL ,您的上述查询可以更改为:
def result = sql.rows( "SELECT * FROM table LIMIT ${Sql.expand x}, 1000" )
其他数据库对于此类事情会有不同的方法......我不相信有标准的实现
关于sql - Groovy Sql 分页行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8359082/