Ich bin derzeit experimentieren mit EJB3 als Vorstudie für ein großes Projekt bei der Arbeit. Eines der Dinge, die ich suche, ist Abfrage-Caching.
Ich habe ein sehr einfaches Domänenmodell mit JPA-Annotationen, einer @Local-Geschäftsschnittstelle und einer @Stateless-Implementierung in einem EJB-JAR erstellt, das zusammen mit einer sehr einfachen Webapp in einer EAR bereitgestellt wird, um einige grundlegende Tests durchzuführen. Die EAR wird in der Standardkonfiguration von JBoss 5.0.1 ohne Änderungen bereitgestellt. Dies war sehr einfach und funktionierte wie erwartet.
Bei meinem letzten Test, bei dem es um die Zwischenspeicherung von Abfragen ging, erhielt ich jedoch einige seltsame Ergebnisse:
- Ich habe eine Domänenklasse, die nur eine ID und einen String-Wert zuordnet, und habe etwa 10000 Zeilen in dieser bestimmten Tabelle erstellt
- In der Business Bean gibt es eine sehr einfache Abfrage: SELECT m FROM MyClass m
- Ohne Zwischenspeicher dauert die Ausführung im Durchschnitt 400 ms.
- Bei aktiviertem Abfrage-Cache (durch Hinweise auf die Abfrage) dauert die erste Ausführung natürlich etwas länger, etwa 1200 ms. Die nächsten Ausführungen dauern im Durchschnitt 3500ms!
Das verwirrte mich, also aktivierte ich show_sql von Hibernate, um mir das Protokoll anzusehen. Ohne Cache und bei der ersten Ausführung mit aktiviertem Cache wird ein SELECT protokolliert, wie erwartet. Wenn ich Cache-Treffer erhalten sollte, protokolliert Hibernate ein SELECT für jede Zeile in der Datenbanktabelle.
Das würde sicherlich die langsame Ausführungszeit erklären, aber kann mir jemand sagen, warum das passiert?
0 Stimmen
In meinem Blog finden Sie einige nützliche Informationen über den Abfrage-Cache hier: * tech.puredanger.com/2009/07/10/hibernate-query-cache