2012-10-04 23 views
8

我需要用一個非常慢的請求來調試Grails應用程序。我有SQL日誌記錄,但希望查看SQL查詢的數量而不用手動計數。如何計算hibernate在一個Grails請求中做了多少SQL查詢?

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

對於eaxmple讓每個請求(其中x是所有查詢到SQL服務器取得的量)後下列行:

[2012年10月4日13:41:45049] [LoggingFilters]信息 - 請求在8296毫秒完成並提出x SQL語句

經過一些谷歌搜索後,這似乎不可能用於Grails,所以也許MySQL可以提供的信息?

+1

打開它看看這個[這](http://johnrellis.blogspot.com/2012/06/ gorm-false-sense-of-simplicity.html)blogpost。在這裏你可以找到一個很好的解釋如何測試數據庫的查詢數量。 –

回答

8

你可以通過使用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

還要注意的是有一個性能的影響用這個的時候,所以它應該被使用只在開發環境中。

+0

謝謝!這正是我正在尋找的資源! Hibernate API文檔中的「Statistics」看起來也是一個很好的地方。 – aarreoskari

+0

輝煌答案! –

+1

嘿,我把它變成了[Grails插件](http://grails.org/plugin/log-hibernate-stats),以防萬一它有幫助!也感謝Himanshu的[原始文章](http://www.intelligrape.com/blog/2011/11/07/grails-find-number-of-queries-executed-for-a-particular-request/)賽斯。 – Igor

0

Grails中使用loggingSql

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

,你會發現Grails的利用所有的SQL語句將被記錄。

+1

是的,我已經啓用了loggingSql。我最需要的是SQL語句的計數。 – aarreoskari

1

您是否考慮過一些低技術解決方案,如通過wc -l運行輸出?

+0

不幸的是,hibernate不會在日誌中打印每行的查詢。但是你可以計算字符串「select」的出現次數。當然,你必須截斷每個會話之間的日誌文件。但作爲一種解決方法起作用! – aarreoskari

0

正如伯特貝克威思在他的博客「的東西,我學到諮詢說:」 http://burtbeckwith.com/blog/?p=1570

SQL日誌

有兩種方法可以從查詢的SQL視圖輸出;在DataSource.groovy中添加logSql = true並配置Log4j記錄器。 Log4j方法更加靈活,因爲它不會轉儲到標準輸出,並且可以路由到文件或其他appender並方便地啓用和禁用。但事實證明,切換logSql SQL控制檯日誌很容易。獲取給SessionFactory的bean的引用(例如使用依賴注入高清SessionFactory的),並與

sessionFactory.settings.sqlStatementLogger.logToStdout = true 

and off with 

sessionFactory.settings.sqlStatementLogger.logToStdout = false 
+0

謝謝。我已經設置了Log4j,但沒有它,這將是獲取一些調試信息的更快方式。謝謝。 – aarreoskari