Verschillende logboekniveaus in slaapstand

1. Overzicht

Omdat Hibernate de interactie met de database voor ons afhandelt, kunnen we snel databasegerelateerde code ontwikkelen. Maar dit kan het debuggen van databasegerelateerde fouten bemoeilijken.

Daarom kan het handig zijn om de interactie van Hibernate met de database te bekijken. Bijvoorbeeld de SQL die wordt gegenereerd door Hibernate om gegevens uit een tabel te lezen.

In deze tutorial zullen we de verschillende inlogniveaus in Hibernate zien die kunnen worden gebruikt om dit te bereiken.

2. Logboekregistratie van SQL

Op het meest basale niveau kunnen we de SQL-instructies die door Hibernate zijn gegenereerd, loggen zonder dat de feitelijke parameterwaarden eraan worden doorgegeven.

Hibernate gebruikt de categorie org.hibernate.SQL om deze informatie te loggen. Het enige dat we hoeven te doen, is het logboekregistratieniveau van deze categorie instellen op DEBUG.

In Log4J moeten we een logger element in de configuratie-XML:

Evenzo voegen we in Log4J2 een Logger element:

En in Logback voegen we een logger element:

We zouden nu de gegenereerde SQL in de logboeken moeten zien:

2019-12-07 23:04:23 | DEBUG | [main] o.h.SQL: 127 - invoegen in Employee (employeeNumber, name, title, id) waarden (?,?,?,?) 2019-12-07 23:04:23 | DEBUG | [main] o.h.SQL: 127 - selecteer werknemer0_.id als id1_0_, werknemer0_.employeeNumber als werknemer2_0_, werknemer0_.naam als naam3_0_, werknemer0_.titel als titel4_0_ van werknemer werknemer0_

3. Logboekregistratie van parameterwaarden

Hoewel de gegenereerde SQL normaal gesproken voldoende is om problemen te identificeren, willen we soms ook de parameters bekijken die aan de SQL-instructie worden doorgegeven.

Hibernate registreert de invoerparameters en haalt de resultaten op met behulp van de org.hibernate.type.descriptor.sql categorie met een logniveau van SPOOR. Laten we deze categorie nu toevoegen aan onze configuratiebestanden.

In Log4J doen we:

In Log4J2:

En tot slot, in Logback:

Daarom zouden we de parameterwaarden moeten zien die aan de SQL-instructie zijn doorgegeven, evenals het resultaat van de uitvoering:

2019-12-07 23:04:23 | DEBUG | [main] o.h.SQL: 127 - invoegen in Employee (employeeNumber, name, title, id) waarden (?,?,?,?) 2019-12-07 23:04:23 | TRACE | [main] o.h.t.d.s.BasicBinder: 64 - binding parameter [1] als [VARCHAR] - [001] 2019-12-07 23:04:23 | TRACE | [main] o.h.t.d.s.BasicBinder: 64 - binding parameter [2] als [VARCHAR] - [John Smith] 2019-12-07 23:04:23 | TRACE | [main] o.h.t.d.s.BasicBinder: 52 - bindende parameter [3] als [VARCHAR] - [null] 2019-12-07 23:04:23 | TRACE | [main] o.h.t.d.s.BasicBinder: 64 - bindende parameter [4] als [BIGINT] - [1] 2019-12-07 23:04:23 | DEBUG | [main] o.h.SQL: 127 - selecteer werknemer0_.id als id1_0_, werknemer0_.employeeNumber als werknemer2_0_, werknemer0_naam als naam3_0_, werknemer0_.titel als titel4_0_ van werknemer werknemer0_ 2019-12-07 23:04:23 | TRACE | [main] o.h.t.d.s.BasicExtractor: 60 - geëxtraheerde waarde ([id1_0_]: [BIGINT]) - [1] 2019-12-07 23:04:23 | TRACE | [main] o.h.t.d.s.BasicExtractor: 60 - geëxtraheerde waarde ([employee2_0_]: [VARCHAR]) - [001] 07-12-2019 23:04:23 | TRACE | [main] o.h.t.d.s.BasicExtractor: 60 - geëxtraheerde waarde ([name3_0_]: [VARCHAR]) - [John Smith] 2019-12-07 23:04:23 | TRACE | [main] o.h.t.d.s.BasicExtractor: 50 - geëxtraheerde waarde ([title4_0_]: [VARCHAR]) - [null]

Het is vermeldenswaard dat we de org.hibernate.SQL categorie om de bovenstaande informatie te bekijken. We kunnen de twee categorieën onafhankelijk van elkaar in- en uitschakelen.

Maar, het is logisch om in te schakelen org.hibernate.SQL zodat we weten op welke SQL-instructie de parameterwaarden betrekking hebben.

4. Activeer Slaapstandstatistieken

Afgezien van de SQL- en de JDBC-parameterwaarden, kan Hibernate ook statistieken voor elke SQL-instructie loggen. Dit kan handig zijn om mogelijke prestatieproblemen te identificeren.

Hibernate gebruikt de categorie org.hibernate.stat om deze informatie te loggen. Maar Hibernate genereert deze statistieken niet altijd omdat dit een slechte invloed kan hebben op de prestaties.

Eerste, we moeten Hibernate vertellen om deze statistieken te genereren door de configuratie-eigenschap in te stellen hibernate.generate_statistics naar waar.

We kunnen deze eigenschap bijvoorbeeld instellen in onze slaapstand.cfg.xml het dossier:

waar

Samen met deze eigenschap, de categorie instellen org.hibernate.stat to DEBUG zal een instructie loggen met de statistieken voor elke uitgevoerde query. Aan het einde van de sessie wordt ook één logboekinstructie van meerdere regels vastgelegd met samengevatte statistische informatie:

2019-12-07 23:25:18 | DEBUG | [main] o.h.s.i.Statistics Initiator: 101 - Statistieken geïnitialiseerd [enabled = true] 2019-12-07 23:25:19 | DEBUG | [main] o.h.s.i.StatisticsImpl: 729 - HHH000117: HQL: van com.baeldung.hibernate.logging.Employee, tijd: 22ms, rijen: 1 2019-12-07 23:25:19 | INFO | [main] o.h.e.i.StatisticalLoggingSessionEventListener: 258 - Session Metrics {55600 nanoseconden besteed aan het verwerven van 1 JDBC-verbindingen; 178600 nanoseconden besteed aan het vrijgeven van 1 JDBC-verbindingen; 2167200 nanoseconden besteed aan het voorbereiden van 2 JDBC-verklaringen; 2426800 nanoseconden besteed aan het uitvoeren van 2 JDBC-statements; 0 nanoseconden besteed aan het uitvoeren van 0 JDBC-batches; 0 nanoseconden besteed aan het uitvoeren van 0 L2C-putten; 0 nanoseconden besteed aan het uitvoeren van 0 L2C-hits; 0 nanoseconden besteed aan het uitvoeren van 0 L2C-missers; 47098900 nanoseconden besteed aan het uitvoeren van 1 flushes (in totaal 1 entiteiten en 0 verzamelingen doorgespoeld); 0 nanoseconden besteed aan het uitvoeren van 0 gedeeltelijke doorspoelingen (in totaal 0 entiteiten en 0 verzamelingen leeggemaakt)}

Let op de eerste regel in het logboek die aangeeft dat de statistieken zijn ingeschakeld.

5. Log alle activiteiten

Om nog dieper te graven in de interactie van Hibernate met de database, we moeten logboekregistratie inschakelen voor de categorie org. overwinteren. Deze categorie bevat alle berichten die zijn geregistreerd door Hibernate.

Maar we moeten deze categorie met de nodige voorzichtigheid gebruiken, omdat het veel logboekuitvoer kan creëren:

6. Conclusie

In deze tutorial hebben we de verschillende niveaus van inloggen in Hibernate gezien. De gelogde informatie kan erg handig zijn tijdens de ontwikkeling. Maar we moeten voorzichtig zijn bij het inschakelen van dit in productie, omdat dit de prestaties van de applicatie nadelig kan beïnvloeden.

En natuurlijk is de code die bij deze tutorial hoort, te vinden op GitHub.


$config[zx-auto] not found$config[zx-overlay] not found