Varios niveles de registro en Hibernate

1. Información general

Dado que Hibernate maneja la interacción con la base de datos por nosotros, podemos desarrollar código relacionado con la base de datos rápidamente. Pero esto puede dificultar la depuración de errores relacionados con la base de datos.

Por lo tanto, puede ser útil ver la interacción de Hibernate con la base de datos. Por ejemplo, el SQL generado por Hibernate para leer datos de una tabla.

En este tutorial, veremos los diferentes niveles de registro en Hibernate que se pueden usar para lograr esto .

2. SQL de registro

En el nivel más básico, podemos registrar las sentencias SQL generadas por Hibernate sin que se le pasen los valores reales de los parámetros.

Hibernate usa la categoría org.hibernate.SQL para registrar esta información. Entonces, todo lo que tenemos que hacer es establecer el nivel de registro de esta categoría en DEBUG.

En Log4J, tendremos que agregar un elemento de registro en el XML de configuración:

De manera similar, en Log4J2, agregaremos un elemento Logger :

Y, en Logback, agregaremos un elemento de registro :

Ahora deberíamos ver el SQL generado en los registros:

2019-12-07 23:04:23 | DEBUG | [main] o.h.SQL:127 - insert into Employee (employeeNumber, name, title, id) values (?, ?, ?, ?) 2019-12-07 23:04:23 | DEBUG | [main] o.h.SQL:127 - select employee0_.id as id1_0_, employee0_.employeeNumber as employee2_0_, employee0_.name as name3_0_, employee0_.title as title4_0_ from Employee employee0_

3. Registro de valores de parámetros

Aunque normalmente el SQL generado es suficiente para identificar problemas, a veces es posible que deseemos ver también los parámetros que se pasan a la instrucción SQL.

Hibernate registra los parámetros de entrada y los resultados recuperados utilizando la categoría org.hibernate.type.descriptor.sql con un nivel de registro de TRACE . Ahora, agreguemos esta categoría a nuestros archivos de configuración.

En Log4J hacemos:

En Log4J2:

Y finalmente, en Logback:

En consecuencia, deberíamos ver los valores de los parámetros pasados ​​a la instrucción SQL, así como el resultado de la ejecución:

2019-12-07 23:04:23 | DEBUG | [main] o.h.SQL:127 - insert into Employee (employeeNumber, name, title, id) values (?, ?, ?, ?) 2019-12-07 23:04:23 | TRACE | [main] o.h.t.d.s.BasicBinder:64 - binding parameter [1] as [VARCHAR] - [001] 2019-12-07 23:04:23 | TRACE | [main] o.h.t.d.s.BasicBinder:64 - binding parameter [2] as [VARCHAR] - [John Smith] 2019-12-07 23:04:23 | TRACE | [main] o.h.t.d.s.BasicBinder:52 - binding parameter [3] as [VARCHAR] - [null] 2019-12-07 23:04:23 | TRACE | [main] o.h.t.d.s.BasicBinder:64 - binding parameter [4] as [BIGINT] - [1] 2019-12-07 23:04:23 | DEBUG | [main] o.h.SQL:127 - select employee0_.id as id1_0_, employee0_.employeeNumber as employee2_0_, employee0_.name as name3_0_, employee0_.title as title4_0_ from Employee employee0_ 2019-12-07 23:04:23 | TRACE | [main] o.h.t.d.s.BasicExtractor:60 - extracted value ([id1_0_] : [BIGINT]) - [1] 2019-12-07 23:04:23 | TRACE | [main] o.h.t.d.s.BasicExtractor:60 - extracted value ([employee2_0_] : [VARCHAR]) - [001] 2019-12-07 23:04:23 | TRACE | [main] o.h.t.d.s.BasicExtractor:60 - extracted value ([name3_0_] : [VARCHAR]) - [John Smith] 2019-12-07 23:04:23 | TRACE | [main] o.h.t.d.s.BasicExtractor:50 - extracted value ([title4_0_] : [VARCHAR]) - [null]

Vale la pena señalar que no necesitamos habilitar la categoría org.hibernate.SQL para ver la información anterior. Podemos habilitar y deshabilitar las dos categorías de forma independiente .

Pero tiene sentido habilitar org.hibernate.SQL para que sepamos con qué declaración SQL se relacionan los valores de los parámetros .

4. Activar estadísticas de Hibernate

Aparte de los valores de los parámetros SQL y JDBC, Hibernate también puede registrar estadísticas para cada declaración SQL. Esto puede resultar útil para identificar posibles problemas de rendimiento.

Hibernate usa la categoría org.hibernate.stat para registrar esta información. Pero, Hibernate no siempre genera estas estadísticas porque puede tener una mala influencia en el rendimiento.

Primero, debemos decirle a Hibernate que genere estas estadísticas estableciendo la propiedad de configuración hibernate.generate_statistics en verdadero .

Por ejemplo, podemos establecer esta propiedad en nuestro archivo hibernate.cfg.xml :

true

Junto con esta propiedad, configurar la categoría org.hibernate.stat en DEBUG registrará una declaración con las estadísticas de cada consulta ejecutada . También registrará una declaración de registro de varias líneas al final de la sesión que tendrá información estadística resumida:

2019-12-07 23:25:18 | DEBUG | [main] o.h.s.i.StatisticsInitiator:101 - Statistics initialized [enabled=true] 2019-12-07 23:25:19 | DEBUG | [main] o.h.s.i.StatisticsImpl:729 - HHH000117: HQL: from com.baeldung.hibernate.logging.Employee, time: 22ms, rows: 1 2019-12-07 23:25:19 | INFO | [main] o.h.e.i.StatisticalLoggingSessionEventListener:258 - Session Metrics { 55600 nanoseconds spent acquiring 1 JDBC connections; 178600 nanoseconds spent releasing 1 JDBC connections; 2167200 nanoseconds spent preparing 2 JDBC statements; 2426800 nanoseconds spent executing 2 JDBC statements; 0 nanoseconds spent executing 0 JDBC batches; 0 nanoseconds spent performing 0 L2C puts; 0 nanoseconds spent performing 0 L2C hits; 0 nanoseconds spent performing 0 L2C misses; 47098900 nanoseconds spent executing 1 flushes (flushing a total of 1 entities and 0 collections); 0 nanoseconds spent executing 0 partial-flushes (flushing a total of 0 entities and 0 collections) }

Tenga en cuenta la primera línea del registro que indica que las estadísticas están habilitadas.

5. Registrar toda la actividad

Para profundizar aún más en la interacción de Hibernate con la base de datos, tendremos que habilitar el registro para la categoría org.hibernate . Esta categoría contiene todos los mensajes registrados por Hibernate.

Pero debemos usar esta categoría con precaución, ya que podría generar una gran cantidad de resultados de registro:

6. Conclusión

En este tutorial, vimos los diferentes niveles de registro en Hibernate. La información registrada puede resultar muy útil durante el desarrollo. Pero debemos tener cuidado al habilitar esto en producción, ya que puede afectar negativamente el rendimiento de la aplicación.

Y, por supuesto, el código que acompaña a este tutorial se puede encontrar en GitHub.