8

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

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

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

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

经过一番谷歌搜索后,Grails 似乎无法做到这一点,所以也许 MySQL 可以提供信息?

4

4 回答 4

9

您可以通过使用过滤器和休眠统计信息来做到这一点。在 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

在 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 回答
0

正如 Burt Beckwith 在他的博客文章“我学到的咨询”中所说的那样http://burtbeckwith.com/blog/?p=1570

SQL 日志记录

有两种方法可以查看查询的 SQL 输出;在 DataSource.groovy 中添加 logSql = true 并配置 Log4j 记录器。Log4j 方法更加灵活,因为它不仅可以转储到标准输出,而且可以路由到文件或其他附加程序,并且可以方便地启用和禁用。但事实证明,切换 logSql SQL 控制台日志记录很容易。获取对 sessionFactory bean 的引用(例如,使用 def sessionFactory 的依赖注入)并打开它

sessionFactory.settings.sqlStatementLogger.logToStdout = true

and off with

sessionFactory.settings.sqlStatementLogger.logToStdout = false
于 2012-10-04T16:19:27.387 回答