sql - Groovy Sql 分页行为

标签 sql groovy

我正在使用 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/

相关文章:

sql - 一次删除多个表

mysql - 使用 Doctrine 查询生成器执行联接查询

具有多个分组或排序的 mysql 查询优化

java - 无法在自定义 gradle 插件实现中使用外部依赖项

spring - 如何在gradle中获取依赖项的元数据?

java - 无法在Eclipse上运行Grails应用

java - 如何避免分布式系统中的数据库 ID 冲突

unit-testing - Spock spy 注册的 Groovy 方法调用太少(无)

grails - Grails发布关联列表中的重复姓氏

c# - 带主键的批量复制不起作用