Forskellige logningsniveauer i dvale

1. Oversigt

Da Hibernate håndterer interaktionen med databasen for os, er vi i stand til hurtigt at udvikle database-relateret kode. Men dette kan gøre fejlretning af databaserelaterede fejl vanskelige.

Derfor kan det være nyttigt at se interaktionen mellem dvale med databasen. For eksempel den SQL, der genereres af dvale for at læse data fra en tabel.

I denne vejledning ser vi de forskellige niveauer af logning i dvale, der kan bruges til at opnå dette.

2. Logning af SQL

På det mest basale niveau kan vi logge de SQL-sætninger, der genereres af dvale, uden at de faktiske parameterværdier overføres til det.

Dvaletilstand bruger kategorien org.hibernate.SQL for at logge disse oplysninger. Så alt hvad vi skal gøre er at indstille loggeniveauet for denne kategori til FEJLFINDE.

I Log4J bliver vi nødt til at tilføje en logger element i XML-konfigurationen:

På samme måde tilføjer vi en i Log4J2 Logger element:

Og i Logback tilføjer vi en logger element:

Vi skal nu se den genererede SQL i logfilerne:

2019-12-07 23:04:23 | AFBRUG | [main] o.h.SQL: 127 - indsæt i Medarbejder (medarbejderNummer, navn, titel, id) værdier (?,?,?,?) 2019-12-07 23:04:23 | AFBRUG | [main] o.h.SQL: 127 - vælg medarbejder0_.id som id1_0_, medarbejder0_.medarbejderNummer som medarbejder2_0_, medarbejder0_.navn som navn3_0_, medarbejder0_.titel som titel4_0_ fra Medarbejdermedarbejder0_

3. Logning af parameterværdier

Selvom den genererede SQL normalt er nok til at identificere problemer, vil vi nogle gange også gerne se de parametre, der sendes til SQL-sætningen.

Dvaletilstand logger inputparametrene og hentede resultater ved hjælp af org.hibernate.type.descriptor.sql kategori med et logniveau på SPOR. Lad os nu tilføje denne kategori til vores konfigurationsfiler.

I Log4J gør vi:

I Log4J2:

Og endelig i Logback:

Derfor bør vi se parameterværdierne sendt til SQL-sætningen såvel som resultatet af udførelsen:

2019-12-07 23:04:23 | AFBRUG | [main] o.h.SQL: 127 - indsæt i Medarbejder (medarbejderNummer, navn, titel, id) værdier (?,?,?,?) 2019-12-07 23:04:23 | SPOR | [main] o.h.t.d.s.BasicBinder: 64 - bindende parameter [1] som [VARCHAR] - [001] 2019-12-07 23:04:23 | SPOR | [main] o.h.t.d.s.BasicBinder: 64 - bindingsparameter [2] som [VARCHAR] - [John Smith] 2019-12-07 23:04:23 | SPOR | [main] o.h.t.d.s.BasicBinder: 52 - bindingsparameter [3] som [VARCHAR] - [null] 2019-12-07 23:04:23 | SPOR | [main] o.h.t.d.s.BasicBinder: 64 - bindingsparameter [4] som [BIGINT] - [1] 2019-12-07 23:04:23 | AFBRUG | [main] o.h.SQL: 127 - vælg medarbejder0_.id som id1_0_, medarbejder0_.medarbejderNummer som medarbejder2_0_, medarbejder0_.navn som navn3_0_, medarbejder0_.titel som titel4_0_ fra Medarbejdermedarbejder0_ 2019-12-07 23:04:23 | SPOR | [main] o.h.t.d.s.BasicExtractor: 60 - ekstraheret værdi ([id1_0_]: [BIGINT]) - [1] 2019-12-07 23:04:23 | SPOR | [main] o.h.t.d.s.BasicExtractor: 60 - ekstraheret værdi ([medarbejder2_0_]: [VARCHAR]) - [001] 2019-12-07 23:04:23 | SPOR | [main] o.h.t.d.s.BasicExtractor: 60 - ekstraheret værdi ([name3_0_]: [VARCHAR]) - [John Smith] 2019-12-07 23:04:23 | SPOR | [main] o.h.t.d.s.BasicExtractor: 50 - ekstraheret værdi ([title4_0_]: [VARCHAR]) - [null]

Det er værd at bemærke, at vi ikke behøver at aktivere org.hibernate.SQL kategori for at se ovenstående oplysninger. Vi kan aktivere og deaktivere de to kategorier uafhængigt.

Men, det giver mening at aktivere org.hibernate.SQL så vi ved, hvilken SQL-sætning parameterværdierne vedrører.

4. Aktivér dvaletilstandsstatistikker

Bortset fra værdierne SQL og JDBC kan Hibernate også logge statistik for hver SQL-sætning. Dette kan være nyttigt at identificere potentielle præstationsproblemer.

Dvaletilstand bruger kategorien org.hibernate.stat for at logge disse oplysninger. Men dvale genererer ikke altid disse statistikker, fordi det kan have en dårlig indflydelse på ydeevnen.

Først, vi skal fortælle dvale at generere disse statistikker ved at indstille konfigurationsegenskaben hibernate.generate_statistics til rigtigt.

For eksempel kan vi indstille denne egenskab i vores hibernate.cfg.xml fil:

rigtigt

Sammen med denne ejendom indstilling af kategori org.hibernate.stat til DEBUG logger en erklæring med statistikken for hver udført forespørgsel. Det logger også en logintegning med flere linier i slutningen af ​​sessionen, der har opsummeret statistisk information:

2019-12-07 23:25:18 | AFBRUG | [main] o.h.s.i.StatisticsInitiator: 101 - Statistik initialiseret [aktiveret = sand] 2019-12-07 23:25:19 | AFBRUG | [main] o.h.s.i.StatisticsImpl: 729 - HHH000117: HQL: fra com.baeldung.hibernate.logging.Ansatte, tid: 22ms, rækker: 1 2019-12-07 23:25:19 | INFO | [main] o.h.e.i.StatisticalLoggingSessionEventListener: 258 - Session Metrics {55600 nanosekunder brugt på at erhverve 1 JDBC-forbindelser; 178600 nanosekunder brugt på frigivelse af 1 JDBC-forbindelser; 2167200 nanosekunder brugt på at forberede 2 JDBC-udsagn; 2426800 nanosekunder brugt på at udføre 2 JDBC-udsagn; 0 nanosekunder brugt på at udføre 0 JDBC-batches; 0 nanosekunder brugt til at udføre 0 L2C sætter; 0 nanosekunder brugt på at udføre 0 L2C hits; 0 nanosekunder brugt til at udføre 0 L2C-misser; 47098900 nanosekunder brugt til at udføre 1 skylninger (skylning i alt 1 enheder og 0 samlinger); 0 nanosekunder brugt på at udføre 0 delvis-skylninger (skylning i alt 0 enheder og 0 samlinger)}

Bemærk den første linje i loggen, der angiver, at statistikken er aktiveret.

5. Log al aktivitet

At grave endnu dybere i dvaleens interaktion med databasen, vi bliver nødt til at aktivere logning af kategorien org. dvale. Denne kategori indeholder alle meddelelser, der er logget af dvaletilstand.

Men vi skal bruge denne kategori med forsigtighed, da det kan skabe en masse logoutput:

6. Konklusion

I denne vejledning så vi de forskellige niveauer af logning i dvale. De loggede oplysninger kan være meget nyttige under udviklingen. Men vi skal være forsigtige med at aktivere dette i produktionen, da det kan påvirke applikationens ydeevne negativt.

Og selvfølgelig kan koden, der ledsager denne vejledning, findes på GitHub.