如何计算hibernate在一个Grails请求中执行的SQL查询数量?

aar*_*ari 8 sql grails logging hibernate

我需要使用一个非常慢的请求来调试Grails应用程序.我有SQL日志记录,但希望看到SQL查询的数量而不用手动计算它们.

debug    'org.hibernate.SQL'
trace    'org.hibernate.type'
Run Code Online (Sandbox Code Playgroud)

对于eaxmple,在每个请求之后有以下行(其中x是对SQL Server进行的所有查询的数量):

[2012-10-04 13:41:45,049] [LoggingFilters] INFO - 请求在8296 ms内完成并生成x SQL语句

经过一些谷歌搜索,这似乎与Grails不可能,所以也许MySQL可以提供信息?

MBo*_*zic 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()
        }

    }

    }

}
Run Code Online (Sandbox Code Playgroud)

有关各种Hibernate统计信息的更多信息,请阅读以下文章:http: //www.javalobby.org/java/forums/t19807.html

另请注意,使用它时会对性能产生影响,因此它应该只在开发环境中使用.