2012-10-04 8 views
8

Ho bisogno di eseguire il debug di un'applicazione Grails con una richiesta veramente lenta. Ho una registrazione SQL ma vorrei vedere la quantità di query SQL senza contarle manualmente.Come posso contare quante query SQL vanno in ibernazione in una richiesta Grails?

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

Per eaxmple di avere seguente riga dopo ogni richiesta (dove x è la quantità di tutte le query fatte al server SQL):

[2012/10/04 13: 41: 45.049] [LoggingFilters] INFO - Richiesta terminata in 8296 ms e resa x istruzioni SQL

Dopo alcuni googling questo non sembra essere possibile con Grails, quindi forse MySQL potrebbe fornire le informazioni?

+1

Date un'occhiata a questo [questo] (http://johnrellis.blogspot.com/2012/06/ gorm-false-sense-of-simplicity.html) blogpost. Qui puoi trovare una bella spiegazione su come testare il numero di query sul database. –

risposta

8

È possibile farlo utilizzando i filtri e le statistiche di ibernazione. Creare la classe ExampleFilters.groovy nella cartella conf. Questo è il contenuto della classe:

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

    } 

    } 

} 

Per leggere di più su varie statistiche Hibernate leggere questo articolo: http://www.javalobby.org/java/forums/t19807.html

anche notare che v'è un impatto sulle prestazioni quando si utilizza questo, in modo che in realtà dovrebbe essere utilizzato solo in ambiente di sviluppo.

+0

Grazie! Questa era esattamente la risorsa che stavo cercando! 'Statistics' in Hibernate API-documentation sembra un buon posto dove dare un'occhiata anche. – aarreoskari

+0

geniale risposta! –

+1

Ehi, l'ho trasformato in un [plugin Grails] (http://grails.org/plugin/log-hibernate-stats) nel caso sia utile! Credito anche al [post originale] (http://www.intelligrape.com/blog/2011/11/07/grails-find-number-of-queries-executed-for-a-particular-request/) di Himanshu Seth. – Igor

0

in graal utilizzare loggingSql

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

si noterà che tutte le istruzioni SQL Grails utilizzano verranno registrati.

+1

Sì, ho già abilitato loggingSql. Quello di cui ho bisogno è il conteggio delle istruzioni SQL alla fine. – aarreoskari

1

Avete considerato alcune soluzioni a bassa tecnologia come l'esecuzione dell'uscita tramite wc -l?

+0

Hibernate non stampa le query per riga nel registro. Ma potresti contare le occorrenze della stringa "seleziona". Ovviamente dovresti troncare il file di registro tra ogni sessione. Ma funziona come soluzione! – aarreoskari

0

Come ha detto Burt Beckwith nel suo blog post "Stuff I Learned Consulting" http://burtbeckwith.com/blog/?p=1570

SQL registrazione

Ci sono due modi per visualizzare l'uscita SQL dalle query; aggiungendo logSql = true in DataSource.groovy e configurando i logger Log4j. L'approccio di Log4j è molto più flessibile poiché non si limita a eseguire lo stdout e può essere indirizzato a un file o ad un altro appender e opportunamente abilitato e disabilitato. Ma risulta che è facile attivare la registrazione della console SQL logSql. Ottenere un riferimento al bean sessionFactory (ad esempio utilizzando l'iniezione di dipendenza con def sessionFactory) e accenderlo con

sessionFactory.settings.sqlStatementLogger.logToStdout = true 

and off with 

sessionFactory.settings.sqlStatementLogger.logToStdout = false 
+0

Grazie.Ho già installato Log4j, ma senza di esso questo sarebbe un modo più veloce per ottenere alcune informazioni di debug. Grazie. – aarreoskari

Problemi correlati