2012-10-04 18 views
8

Necesito depurar una aplicación Grails con una solicitud realmente lenta. Tengo el registro SQL pero me gustaría ver la cantidad de consultas SQL sin contarlas manualmente.¿Cómo puedo contar cuántas consultas SQL hibernate hace en una solicitud de Grails?

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

Para eaxmple para tener siguiente línea después de cada petición (donde x es la cantidad de todas las consultas hecho al servidor SQL):

[10/04/2012 13: 41: 45 049] [LoggingFilters] INFORMACIÓN - Solicitud finalizada en 8296 ms y realizada x sentencias SQL

Después de googlear, parece que esto no es posible con Grails, ¿entonces tal vez MySQL podría proporcionar la información?

+1

Tome un vistazo a esto [esta] (http://johnrellis.blogspot.com/2012/06/ gorm-falso-sentido-de-simplicidad.html) blogpost. Aquí puede encontrar una buena explicación sobre cómo probar el número de consultas en la base de datos. –

Respuesta

8

Puede hacerlo utilizando los filtros y las estadísticas de hibernación. Crea la clase ExampleFilters.groovy en la carpeta conf. Este es el contenido de la clase:

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

    } 

    } 

} 

Para leer más sobre varias estadísticas Hibernate leer este artículo: http://www.javalobby.org/java/forums/t19807.html

También tenga en cuenta que hay un impacto en el rendimiento cuando se utiliza esta, por lo que realmente se debe utilizar solo en el entorno de desarrollo.

+0

Gracias! ¡Este era exactamente el recurso que estaba buscando! 'Statistics' en la documentación de Hibernate API parece ser un buen lugar para echar un vistazo también. – aarreoskari

+0

¡respuesta brillante! –

+1

¡He convertido esto en un [plugin de Grails] (http://grails.org/plugin/log-hibernate-stats) en caso de que sea útil! También crédito al [post original] (http://www.intelligrape.com/blog/2011/11/07/grails-find-number-of-queries-executed-for-a-particular-request/) de Himanshu Seth. – Igor

0

en griales usar loggingSql

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

Usted notará que todas las sentencias SQL Griales utilizan se registrarán.

+1

Sí, ya tengo loggingSql habilitado. Lo que necesito es el recuento de las sentencias de SQL al final. – aarreoskari

1

¿Ha considerado algunas soluciones de baja tecnología como ejecutar la salida a través de wc -l?

+0

Lamentablemente, hibernar no imprime consultas por línea en el registro. Pero podría contar las ocurrencias de cadena "seleccionar". Por supuesto, tendría que truncar el archivo de registro entre cada sesión. ¡Pero funciona como una solución alternativa! – aarreoskari

0

Como dijo Burt Beckwith en su blog "Cosas I aprendido Consulting" http://burtbeckwith.com/blog/?p=1570

SQL registro

Hay dos formas de ver la salida de las consultas SQL; añadiendo logSql = true en DataSource.groovy y configurando loggers Log4j. El enfoque de Log4j es mucho más flexible, ya que no solo se elimina a stdout, sino que también se puede enrutar a un archivo u otro apéndice y se habilita y deshabilita convenientemente. Pero resulta que es fácil alternar el registro de la consola logSql SQL. Obtener una referencia al bean sessionFactory (por ejemplo, el uso de la inyección de dependencia con sessionFactory def) y encenderlo con

sessionFactory.settings.sqlStatementLogger.logToStdout = true 

and off with 

sessionFactory.settings.sqlStatementLogger.logToStdout = false 
+0

Gracias.Ya tenía configurado Log4j, pero sin él, esta sería una forma más rápida de obtener información de depuración. Gracias. – aarreoskari

Cuestiones relacionadas