Verschiedene Protokollierungsstufen im Ruhezustand

1. Übersicht

Da Hibernate die Interaktion mit der Datenbank für uns übernimmt, können wir schnell datenbankbezogenen Code entwickeln. Dies kann jedoch das Debuggen datenbankbezogener Fehler erschweren.

Daher kann es nützlich sein, die Interaktion von Hibernate mit der Datenbank anzuzeigen. Zum Beispiel das von Hibernate generierte SQL zum Lesen von Daten aus einer Tabelle.

In diesem Lernprogramm werden die verschiedenen Ebenen der Protokollierung im Ruhezustand beschrieben, mit denen dies erreicht werden kann .

2. SQL protokollieren

Auf der einfachsten Ebene können wir die von Hibernate generierten SQL-Anweisungen protokollieren, ohne dass die tatsächlichen Parameterwerte an sie übergeben werden.

Hibernate verwendet die Kategorie org.hibernate.SQL , um diese Informationen zu protokollieren. Alles was wir tun müssen, ist die Protokollierungsstufe dieser Kategorie auf DEBUG zu setzen.

In Log4J müssen wir dem Konfigurations-XML ein Logger- Element hinzufügen :

In ähnlicher Weise fügen wir in Log4J2 ein Logger- Element hinzu:

Und in Logback fügen wir ein Logger- Element hinzu:

Wir sollten jetzt das generierte SQL in den Protokollen sehen:

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. Protokollieren von Parameterwerten

Obwohl normalerweise das generierte SQL ausreicht, um Probleme zu identifizieren, möchten wir manchmal auch die Parameter anzeigen, die an die SQL-Anweisung übergeben werden.

Der Ruhezustand protokolliert die Eingabeparameter und die abgerufenen Ergebnisse mithilfe der Kategorie org.hibernate.type.descriptor.sql mit der Protokollstufe TRACE . Fügen wir diese Kategorie nun unseren Konfigurationsdateien hinzu.

In Log4J machen wir:

In Log4J2:

Und schließlich in Logback:

Folglich sollten die an die SQL-Anweisung übergebenen Parameterwerte sowie das Ergebnis der Ausführung angezeigt werden:

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]

Es ist erwähnenswert, dass wir die Kategorie org.hibernate.SQL nicht aktivieren müssen, um die obigen Informationen anzuzeigen. Wir können die beiden Kategorien unabhängig voneinander aktivieren und deaktivieren .

Es ist jedoch sinnvoll, org.hibernate.SQL zu aktivieren, damit wir wissen, auf welche SQL-Anweisung sich die Parameterwerte beziehen .

4. Aktivieren Sie die Statistik für den Ruhezustand

Neben den SQL- und JDBC-Parameterwerten kann Hibernate auch Statistiken für jede SQL-Anweisung protokollieren. Dies kann hilfreich sein, um potenzielle Leistungsprobleme zu identifizieren.

Hibernate verwendet die Kategorie org.hibernate.stat , um diese Informationen zu protokollieren. Hibernate generiert diese Statistiken jedoch nicht immer, da dies einen schlechten Einfluss auf die Leistung haben kann.

Zuerst müssen wir Hibernate anweisen, diese Statistiken zu generieren, indem wir die Konfigurationseigenschaft hibernate.generate_statistics auf true setzen .

Zum Beispiel können wir diese Eigenschaft in unserer Datei hibernate.cfg.xml festlegen :

true

Wenn Sie zusammen mit dieser Eigenschaft die Kategorie org.hibernate.stat auf DEBUG setzen, wird für jede ausgeführte Abfrage eine Anweisung mit den Statistiken protokolliert . Außerdem wird am Ende der Sitzung eine mehrzeilige Protokollanweisung protokolliert, in der statistische Informationen zusammengefasst sind:

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

Beachten Sie die erste Zeile im Protokoll, die angibt, dass die Statistiken aktiviert sind.

5. Alle Aktivitäten protokollieren

Um noch tiefer in die Interaktion von Hibernate mit der Datenbank einzusteigen , müssen wir die Protokollierung für die Kategorie org.hibernate aktivieren . Diese Kategorie enthält alle von Hibernate protokollierten Nachrichten.

Wir müssen diese Kategorie jedoch mit Vorsicht verwenden, da sie möglicherweise viele Protokollausgaben erzeugt:

6. Fazit

In diesem Tutorial haben wir die verschiedenen Ebenen der Protokollierung im Ruhezustand gesehen. Die protokollierten Informationen können während der Entwicklung sehr nützlich sein. Wir müssen jedoch vorsichtig sein, wenn wir dies in der Produktion aktivieren, da dies die Anwendungsleistung beeinträchtigen kann.

Und natürlich ist der Code, der diesem Tutorial beiliegt, auf GitHub zu finden.