Hibernate-Tipps: Anzahl der Abfragen schnell und einfach ermitteln

Neuigkeiten von der Insel  –  0 Kommentare

Die Hibernate-Tipps-Serie bietet schnelle und einfache Lösungen zu verbreiteten Hibernate-Fragen. Dieses Mal geht es um die durch Hibernate ausgeführten Abfragen und wie diese gezählt werden können.

Frage

Einige meiner Anwendungsfälle sind langsam und scheinen mehr Abfragen auszulösen als ich JPQL-Abfragen ausführe. Wie kann ich alle Abfragen zählen, die innerhalb einer Hibernate-Sitzung ausgeführt werden?

Lösung

Hibernates Statistikkomponente bietet die einfachste Möglichkeit, alle ausgeführten Abfragen zu zählen. Nachdem die Komponente aktiviert wurde, sammelt Hibernate verschiedene interne Statistiken und stellt diese als Logmeldung und über eine API zur Verfügung. Das Sammeln dieser Informationen bremst allerdings die Anwendung und sollte daher nicht in Produktion verwendet werden!

Hibernates Statistikkomponente ist standardmäßig deaktiviert. Um sie zu aktivieren, muss der Parameter hibernate.generate_statistics auf true gesetzt werden. Dies kann entweder durch die Angabe einer gleichnamigen Systemeigenschaft oder durch Setzen des Parameters in der persistence.xml-Datei erfolgen.

<persistence>
<persistence-unit name=”my-persistence-unit”>
<description>Hibernate Tips</description>
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>

<properties>
<property name=”hibernate.generate_statistics” value=”true” />

</properties>
</persistence-unit>
</persistence>

Hibernate bietet zwei Möglichkeiten um auf die Statistiken zuzugreifen. Es kann eine Zusammenfassung mit den wichtigsten Informationen jeder Sitzung in die Logdatei schreiben oder man kann über die Statistik-API auf alle Details zugreifen.

Das folgende Snippet zeigt eine solche Logmeldung. Die Anzahl der SQL-Anweisungen und der Zeitaufwand für deren Vorbereitung und Ausführung werden in den Zeilen 4 und 5 gezeigt. Mit diesen Informationen erhält man bereits während der Entwicklung einen ersten Überblick über die Anzahl der ausgeführten Abfragen und kann diese mit seinen Erwartungen vergleichen. Die Statistiken sollten daher auf jedem Entwicklungssystem aktiviert sein.

16:24:55,318 INFO [org.hibernate.engine.internal.StatisticalLoggingSessionEventListener] – Session Metrics {
25659 nanoseconds spent acquiring 1 JDBC connections;
22394 nanoseconds spent releasing 1 JDBC connections;
1091216 nanoseconds spent preparing 12 JDBC statements;
11118842 nanoseconds spent executing 12 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;
16999942 nanoseconds spent executing 1 flushes (flushing a total of 17 entities and 17 collections);
63915 nanoseconds spent executing 1 partial-flushes (flushing a total of 0 entities and 0 collections)
}

Hibernate Tips – das Buch

Mehr als 70 solcher Rezepte zu Themen wie einfache und komplexe Mappingdefinitionen, Logging, Unterstützung von Java 8, Caching sowie die statische und dynamische Erzeugung von Abfragen gibt es in meinem Buch "Hibernate Tips: More than 70 solutions to common Hibernate problems". Es ist als Taschenbuch und E-Book auf Amazon und als PDF auf hibernate-tips.com erhältlich.

Über die SessionFactory bietet Hibernate auch einen API-basierten Zugriff auf die gesammelten Statistiken. Dieser erfordert zwar einen zusätzlichen Implementierungsaufwand, bietet jedoch auch einen deutlich detaillierteren Zugriff.

Statistics stats = sessionFactory.getStatistics();
long queryCount = stats.getQueryExecutionCount();