2012-03-29 14 views
4

sql.rows()Groovyメソッドでデータを取得しようとしましたが、値を返すのに非常に時間がかかりました。なぜsql.rows Groovyメソッドが遅いのですか

私は「標準的な」方法を試しました。それははるかに高速です(150倍速く)。

私には何が欠けていますか?

以下のコードを見てください。最初のメソッドは約2500msで結果を返し、2番目のメソッドは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 
} 

答えて

2

あなたがResultSetから返された各行に対してeventuallycallsSqlGroovyMethods.toRowResultグルーヴィーsql.rowsを呼び出します。

このメソッドは、結果セットの各列を検索するたびにResultSetMetaDataを照会し、resultSetから戻されたListに追加するこれらの各列のデータを取得します。

2番目の例では、nameが必要とする列を直接取得します(わかっているように)。この行をすべての行で行う必要はありません。

+0

応答に感謝しますが、私のテストでは、一度に10行しか取得しないため、SqlGroovyMethods.toRowResultは10回しか呼び出されません。パフォーマンスの違いを説明することはできません。 – Yann

+0

'jvisualvm'でどの機能が時間を費やしているかを見てきましたか? –

2

私はこの方法がとても遅い理由を見つけたと思う:statement.setMaxRows()は決して呼ばれない!役に立たない大量のデータがデータベースによって送信されることを意味

(あなたは、大規模なデータグリッドの最初のページを見たいとき)私はあなたの代わりのsetFetchSizeをしてみた場合、あなたのテストが判明するだろうか疑問に思う

+0

興味深い...ユーザーリストでこれを尋ねることができます。バグとして提出する価値があるかもしれませんし、そこにいる人々は私よりもよく分かっています:-) –

0

setMaxRows。多くのことが、基本的なJDBCドライバのデフォルト動作にあります。

関連する問題