8

1つの非常に遅いリクエストでGrailsアプリケーションをデバッグする必要があります。SQLログがありますが、手動でカウントせずにSQLクエリの量を確認したいと思います。

debug    'org.hibernate.SQL'
trace    'org.hibernate.type'

eaxmpleの場合、各要求の後に次の行があります(xはSQLサーバーに対して行われたすべてのクエリの量です)。

[2012-10-04 13:41:45,049] [LoggingFilters]情報-リクエストは8296ミリ秒で終了し、x個のSQLステートメントを作成しました

いくつかのグーグルの後、これはGrailsでは不可能であるように思われるので、MySQLが情報を提供できるのではないでしょうか。

4

4 に答える 4

9

Filters と Hibernate 統計を使用してそれを行うことができます。conf フォルダーにクラス ExampleFilters.groovy を作成します。クラスの内容は次のとおりです。

import org.hibernate.stat.Statistics
class ExampleFilters {

    def sessionFactory


    def filters = {
    // your filters here

        logHibernateStats(controller: '*', action: '*') {
            before = {
            Statistics stats = sessionFactory.statistics;
            if(!stats.statisticsEnabled) {stats.setStatisticsEnabled(true)}
                   }

        afterView = {
            Statistics stats = sessionFactory.getStatistics()
            double queryCacheHitCount  = stats.getQueryCacheHitCount();
            double queryCacheMissCount = stats.getQueryCacheMissCount();
            double queryCacheHitRatio = (queryCacheHitCount / ((queryCacheHitCount + queryCacheMissCount) ?: 1))
            println """
######################## Hibernate Stats ##############################################
Transaction Count:${stats.transactionCount}
Flush Count:${stats.flushCount}
Total Collections Fetched:${stats.collectionFetchCount}
Total Collections Loaded:${stats.collectionLoadCount}
Total Entities Fetched:${stats.entityFetchCount}
Total Entities Loaded:${stats.entityFetchCount}
Total Queries:${stats.queryExecutionCount}
queryCacheHitCount:${queryCacheHitCount}
queryCacheMissCount:${queryCacheMissCount}
queryCacheHitRatio:${queryCacheHitRatio}
######################## Hibernate Stats ##############################################
"""
            stats.clear()
        }

    }

    }

}

さまざまな Hibernate 統計の詳細については、次の記事を参照してください: http://www.javalobby.org/java/forums/t19807.html

また、これを使用するとパフォーマンスに影響があるため、実際には開発環境でのみ使用する必要があることに注意してください。

于 2012-10-04T13:17:11.350 に答える
1

を介して出力を実行するなど、いくつかのローテク ソリューションを検討しましたwc -lか?

于 2012-10-04T13:04:19.943 に答える
0

BurtBeckwithが彼のブログ投稿「StuffILearnedConsulting」で述べたようにhttp://burtbeckwith.com/blog/?p=1570

SQLロギング

クエリからのSQL出力を表示する方法は2つあります。DataSource.groovyにlogSql=trueを追加し、Log4jロガーを構成します。Log4jのアプローチは、stdoutにダンプするだけでなく、ファイルやその他のアペンダーにルーティングして、簡単に有効または無効にできるため、はるかに柔軟性があります。しかし、logSqlSQLコンソールのロギングを切り替えるのは簡単です。sessionFactory Beanへの参照を取得し(たとえば、def sessionFactoryで依存性注入を使用)、次のコマンドでオンにします。

sessionFactory.settings.sqlStatementLogger.logToStdout = true

and off with

sessionFactory.settings.sqlStatementLogger.logToStdout = false
于 2012-10-04T16:19:27.387 に答える
0

Grails での使用 loggingSql

dataSource {
 dbCreate = "update" // one of 'create', 'create-drop','update'
 url = "jdbc:postgresql://localhost:5432/demodb"
 loggingSql = true
}

Grails が使用するすべての SQL ステートメントがログに記録されることに気付くでしょう。

于 2012-10-04T09:59:41.137 に答える