Почему sql.rows Groovy метод так медленно - PullRequest
4 голосов
/ 29 марта 2012

Я попытался получить некоторые данные с помощью метода sql.rows () Groovy, и для возврата значений потребовалось очень много времени.

Итак, я попробовал «стандартный» способ, и он намного быстрее ( в 150 раз быстрее ).

Что мне не хватает?

Посмотрите на код ниже: первый метод возвращает результаты примерно через 2500 мс, а второй за 15 мс!

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 ]

2 голосов
/ 30 марта 2012

Мне кажется, я нашел причину, по которой этот метод такой медленный: statement.setMaxRows() никогда не вызывается!

Это означает, что база данных отправляет много бесполезных данных (когда вы хотите увидеть первые страницыбольшой таблицы данных)

2 голосов
/ 29 марта 2012

Когда вы вызываете sql.rows, groovy в конечном итоге вызывает SqlGroovyMethods.toRowResult для каждой строки, возвращаемой resultSet.

Этот метод запрашивает ResultSetMetaData для resultSet каждый раз, чтобы найти имена столбцов, а затем извлекает данные для каждого из этих столбцов из resultSet в карту, которую он добавляет в возвращаемый список.

Во втором примере вы напрямую получаете столбцы, требуемые по имени (как вы знаете, что они есть), и избегаете необходимости выполнять этот поиск в каждой строке.

0 голосов
/ 05 апреля 2012

Интересно, как получатся ваши тесты, если вы попытаетесь использовать setFetchSize вместо setMaxRows. Во многом это связано с поведением базового драйвера JDBC по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...