Vari livelli di registrazione in ibernazione

1. Panoramica

Poiché Hibernate gestisce per noi l'interazione con il database, siamo in grado di sviluppare rapidamente codice relativo al database. Tuttavia, questo può rendere difficile il debug degli errori relativi al database.

Quindi, può essere utile visualizzare l'interazione di Hibernate con il database. Ad esempio, l'SQL generato da Hibernate per leggere i dati da una tabella.

In questo tutorial vedremo i diversi livelli di registrazione in Hibernate che possono essere utilizzati per ottenere questo risultato .

2. Registrazione di SQL

Al livello più elementare, possiamo registrare le istruzioni SQL generate da Hibernate senza che gli siano passati i valori dei parametri effettivi.

Hibernate utilizza la categoria org.hibernate.SQL per registrare queste informazioni. Quindi, tutto ciò che dobbiamo fare è impostare il livello di registrazione di questa categoria su DEBUG.

In Log4J, dovremo aggiungere un elemento logger nell'XML di configurazione:

Allo stesso modo, in Log4J2, aggiungeremo un elemento Logger :

E, in Logback, aggiungeremo un elemento logger :

Ora dovremmo vedere l'SQL generato nei log:

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. Registrazione dei valori dei parametri

Sebbene normalmente l'SQL generato sia sufficiente per identificare i problemi, a volte potremmo voler visualizzare anche i parametri passati all'istruzione SQL.

Hibernate registra i parametri di input e recupera i risultati utilizzando la categoria org.hibernate.type.descriptor.sql con un livello di registrazione TRACE . Ora aggiungiamo questa categoria ai nostri file di configurazione.

In Log4J facciamo:

In Log4J2:

E infine, in Logback:

Di conseguenza, dovremmo vedere i valori dei parametri passati all'istruzione SQL nonché il risultato dell'esecuzione:

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 notare che non è necessario abilitare la categoria org.hibernate.SQL per visualizzare le informazioni di cui sopra. Possiamo abilitare e disabilitare le due categorie in modo indipendente .

Tuttavia, ha senso abilitare org.hibernate.SQL in modo da sapere a quale istruzione SQL si riferiscono i valori dei parametri .

4. Attiva le statistiche di ibernazione

Oltre ai valori dei parametri SQL e JDBC, Hibernate può anche registrare le statistiche per ciascuna istruzione SQL. Questo può essere utile per identificare potenziali problemi di prestazioni.

Hibernate utilizza la categoria org.hibernate.stat per registrare queste informazioni. Tuttavia, Hibernate non genera sempre queste statistiche perché può avere una cattiva influenza sulle prestazioni.

Per prima cosa, dobbiamo dire a Hibernate di generare queste statistiche impostando la proprietà di configurazione hibernate.generate_statistics su true .

Ad esempio, possiamo impostare questa proprietà nel nostro file hibernate.cfg.xml :

true

Insieme a questa proprietà, l' impostazione della categoria org.hibernate.stat su DEBUG registrerà un'istruzione con le statistiche per ciascuna query eseguita . Registrerà anche un'istruzione di registro su più righe alla fine della sessione che avrà riepilogato le informazioni statistiche:

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

Notare la prima riga nel registro che indica che le statistiche sono abilitate.

5. Registra tutte le attività

Per approfondire ulteriormente l'interazione di Hibernate con il database, dovremo abilitare il logging per la categoria org.hibernate . Questa categoria contiene tutti i messaggi registrati da Hibernate.

Tuttavia, dobbiamo usare questa categoria con cautela poiché potrebbe creare molto output di log:

6. Conclusione

In questo tutorial, abbiamo visto i diversi livelli di registrazione in Hibernate. Le informazioni registrate possono essere molto utili durante lo sviluppo. Ma dobbiamo stare attenti mentre lo abilitiamo in produzione in quanto può influire negativamente sulle prestazioni dell'applicazione.

E, naturalmente, il codice che accompagna questo tutorial può essere trovato su GitHub.