Una propiedad de Hibernate la cual es muy útil y que nos permite visualizar las consultas realizadas sobre la base de datos, es show_sql la cual al activarse nos muestra las consultas HQL realizadas sobre la base de datos.
hibernate.properties
hibernate.show_sql = true
Aunque es una propiedad muy util, muchas veces es necesario conocer los valores que son enviados o recibidos por la base de datos; en muchos de estos servidores es posible configurarlos para generar trazas de las consultas realizadas, el problema de hacerlo de esta forma, es que para una base de datos muy concurrida, aun siendo de desarrollo, resulta complicado encontrar la consulta realizada.
Para obtener los valores enviados podemos utilizar dos frameworks, Log4j y P6Spy.
Cuando utilizamos el framework de Log4j solo se requiere la modificación de su configuración añadiendo una propiedad.
log4j.properties
log4j.logger.org.hibernate.type=trace
Lo cual nos muestra, de forma separada, el tipo y valor de cada parámetro enviado en la consulta.
Output
13:20:43,281 TRACE StringType:153 - binding 'root' to parameter: 1
13:20:43,296 TRACE BooleanType:153 - binding 'true' to parameter: 2
Otra forma y quizás mas elegante de mostrar las consultas que se realizan es utilizando P6Spy, para lo cual es necesario configurarla, con los siguientes pasos:
- Descargar la ultima version de p6spy-install.zip de su sitio oficial.
- Descomprimir y copiar en el proyecto los archivos p6spy.jar y spy.properties.
- Realizar las configuraciones necesarias para incluir los jars en el proyecto.
- Modificar la configuración de la base de datos. Remplazando el driver utilizado por com.p6spy.engine.spy.P6SpyDriver.
hibernate.properties
#hibernate.connection.driver_class = com.mysql.jdbc.Driver
hibernate.connection.driver_class = com.p6spy.engine.spy.P6SpyDriver
- Por ultimo, es necesario modificar el archivo spy.properties, agregando el driver class que fue remplazado y, en caso de que estemos utilizando Log4j, utilizar su appender. Y quizás sea necesario que elimine del registro los drivers.
spy.properties
# mysql Connector/J driver
realdriver=com.mysql.jdbc.Driver
#specifies the appender to use for logging
appender=com.p6spy.engine.logging.appender.Log4jLogger
#the DriverManager class sequentially tries every driver that is
#registered to find the right driver. In some instances, it's possible to
#load up the realdriver before the p6spy driver, in which case your connections
#will not get wrapped as the realdriver will "steal" the connection before
#p6spy sees it. Set the following property to "true" to cause p6spy to
#explicitily deregister the realdrivers
deregisterdrivers=true
Dando como resultado en la siguiente salida:
Output
p6spy - 1275601495062|0|2|statement|select this_.iId as iId7_5_, ... , adeudos6_.mMonto as mMonto2_4_ from tblUsuario this_ left outer join tblTarjeta tarjetas2_ on this_.iId=tarjetas2_.iIdUsuario left outer join tblAbono abonos3_ on tarjetas2_.iId=abonos3_.iIdTarjeta left outer join tblAclaracion aclaracion4_ on tarjetas2_.iId=aclaracion4_.iIdTarjeta left outer join tblEntradasSalidas entradassa5_ on tarjetas2_.iId=entradassa5_.iIdTarjeta left outer join tblAdeudo adeudos6_ on tarjetas2_.iId=adeudos6_.iIdTarjeta where this_.vchUser=? and this_.bActivo=? order by this_.iId asc limit ?|select this_.iId as iId7_5_, ... , adeudos6_.mMonto as mMonto2_4_ from tblUsuario this_ left outer join tblTarjeta tarjetas2_ on this_.iId=tarjetas2_.iIdUsuario left outer join tblAbono abonos3_ on tarjetas2_.iId=abonos3_.iIdTarjeta left outer join tblAclaracion aclaracion4_ on tarjetas2_.iId=aclaracion4_.iIdTarjeta left outer join tblEntradasSalidas entradassa5_ on tarjetas2_.iId=entradassa5_.iIdTarjeta left outer join tblAdeudo adeudos6_ on tarjetas2_.iId=adeudos6_.iIdTarjeta where this_.vchUser='root' and this_.bActivo='true' order by this_.iId asc limit 1
Lo cual muestra la consulta original sin sustituir los valores, y la consulta creada por el framework sustituida por los valores utilizados.