为什么sql.rows Groovy方法太慢了

时间:2012-03-29 10:56:21

标签: grails groovy

我尝试使用sql.rows()Groovy方法获取一些数据,并且返回值需要很长时间。

所以我尝试了“标准”的方式,它的速度要快得多( 150倍)。

我错过了什么?

请看下面的代码:第一种方法在大约2500ms内返回结果,第二种方法在15ms内返回第二种方法!

class MyService {

javax.sql.DataSource dataSource

def SQL_QUERY = "select M_FIRSTNAME as firstname, M_LASTNAME as lastname, M_NATIONALITY as country from CT_PLAYER order by M_ID asc";

def getPlayers1(int offset, int maxRows)
{
    def t = System.currentTimeMillis()
    def sql = new Sql(dataSource)
    def rows = sql.rows(SQL_QUERY, offset, maxRows)
    println "time1 : ${System.currentTimeMillis()-t}"
    return rows
}

def getPlayers2(int offset, int maxRows) 
{
    def t = System.currentTimeMillis();
    Connection connection = dataSource.getConnection();
    Statement statement = connection.createStatement();
    statement.setMaxRows(offset + maxRows -1);
    ResultSet resultSet = statement.executeQuery(SQL_QUERY);
    def l_list =[];
    if(resultSet.absolute(offset)) {
        while (true) {
            l_list << [
                'firstname':resultSet.getString('firstname'),
                'lastname' :resultSet.getString('lastname'),
                'country'  :resultSet.getString('country')
            ];
            if(!resultSet.next()) break;
        }
    }
    resultSet.close()
    statement.close()
    connection.close()
    println "time2 : ${System.currentTimeMillis()-t}"
    return l_list
}

3 个答案:

答案 0 :(得分:2)

当您为resultSet返回的每一行致电sql.rows groovy eventually calls SqlGroovyMethods.toRowResult时。

每次查找列名时,此方法都会查询resultSet的ResultSetMetaData,然后从resultSet中将每个列的数据提取到Map中,并将其添加到返回的List中。

在第二个示例中,您直接获取name所需的列(因为您知道它们是什么),并且避免每行都要进行此查找。

答案 1 :(得分:2)

我想我发现这个方法太慢的原因:永远不会调用statement.setMaxRows()

这意味着数据库会发送大量无用数据(当您想要查看大型数据网格的第一页时)

答案 2 :(得分:0)

我想知道如果你尝试使用setFetchSize而不是setMaxRows,你的测试结果如何。其中很多都是基础JDBC驱动程序的默认行为。