2012-10-04 15 views
8

Potrzebuję debugować aplikację Grails jedną naprawdę powolną prośbą. Mam rejestrowanie SQL, ale chciałbym zobaczyć ilość zapytań SQL bez liczenia ich ręcznie.Jak mogę zliczyć liczbę zapytań SQL w trybie hibernacji w jednym żądaniu Grails?

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

Na eaxmple mają następującą linię po każdym żądaniu (gdzie X oznacza ilość wszystkich zapytania kierowane do serwera SQL)

[04.10.2012 13: 41: 45049] [LoggingFilters] INFO - Żądanie zakończyło się w 8296 ms i wykonano x instrukcji SQL

Po kilku badaniach nie wydaje się to możliwe w przypadku Grails, więc może MySQL może dostarczyć informacji?

+1

Spójrz na to [to] (http://johnrellis.blogspot.com/2012/06/ gorm-false-sense-of-simplicity.html) blogpost. Tutaj znajdziesz ładne wyjaśnienie, jak przetestować liczbę zapytań do bazy danych. –

Odpowiedz

8

Możesz to zrobić, korzystając ze statystyk Filtry i Hibernacja. Utwórz klasę ExampleFilters.groovy w folderze conf. To jest zawartość klasy:

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() 
     } 

    } 

    } 

} 

Do czytania więcej o różnych statystyk Hibernate przeczytać ten artykuł: http://www.javalobby.org/java/forums/t19807.html

Należy również pamiętać, że istnieje wpływ na wydajność podczas korzystania z tego, więc powinien naprawdę być stosowany tylko w środowisku programistycznym.

+0

Dzięki! To był dokładnie ten zasób, którego szukałem! "Statystyki" w dokumentacji interfejsu API Hibernate wydaje się dobrym miejscem do przyjrzenia się również. – aarreoskari

+0

genialna odpowiedź! –

+1

Hej, zrobiłem to w wtyczce [Grails] (http://grails.org/plugin/log-hibernate-stats) na wszelki wypadek! Podziękowania dla [oryginalnego wpisu] (http://www.intelligrape.com/blog/2011/11/07/grails-find-number-of-queries-executed-for-i-particular-request/) autorstwa Himanshu Seth. – Igor

0

w Grails używać loggingSql

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

zauważysz, że wszystkie instrukcje SQL Grails wykorzystują będą rejestrowane.

+1

Tak, mam już włączony dziennikSql. Potrzebuję na końcu liczby instrukcji SQL. – aarreoskari

1

Czy brałeś pod uwagę kilka rozwiązań low-tech, takich jak uruchamianie wyjścia przez wc -l?

+0

Niestety, hibernacja nie drukuje zapytań na wiersz w logu. Ale można policzyć wystąpienia łańcucha "wybierz". Oczywiście musisz skasować plik dziennika między każdą sesją. Ale działa jako obejście! – aarreoskari

0

Jak Burt Beckwith powiedział w swoim blogu „rzeczy dowiedziałem Consulting” http://burtbeckwith.com/blog/?p=1570

SQL Rejestrowanie

Istnieją dwa sposoby, aby zobaczyć wyjście z zapytań SQL; dodanie logSql = true w DataSource.groovy i skonfigurowanie loggerów Log4j. Podejście Log4j jest o wiele bardziej elastyczne, ponieważ nie tylko zrzuca na standardowe wyjście i może być kierowane do pliku lub innego aplikatora oraz wygodnie włączone i wyłączone. Okazuje się jednak, że można łatwo przełączać logowanie logs SQLSql. Uzyskaj odniesienie do SessionFactory fasoli (np przy użyciu iniekcji zależność z def SessionFactory) i włącz go z

sessionFactory.settings.sqlStatementLogger.logToStdout = true 

and off with 

sessionFactory.settings.sqlStatementLogger.logToStdout = false 
+0

Dzięki.Miałem już skonfigurowany Log4j, ale bez niego byłby to szybszy sposób na uzyskanie informacji o debugowaniu. Dzięki. – aarreoskari

Powiązane problemy