Bei der Verwendung von Hibernate 3.3.0 und ehcache 1.2.3 mit aktiviertem Caching und Query-Cache auf der zweiten Ebene wurde mir klar, dass der folgende Code über mehrere Aufrufe die gleiche Sequenznummer zurückgab, was zu einem Einfügungsfehler führte.
%Vor%Der Code funktioniert ordnungsgemäß, wenn ich den Abfragecache ausschalte oder vor dem Ausführen der Abfrage die folgende Zeile hinzufüge.
%Vor%Dies ist verwirrend, da Hibernate-Dokumente eindeutig angeben
Die meisten Abfragen profitieren nicht von Caching, also standardmäßig keine Abfragen im Cache gespeichert. Um das Caching zu aktivieren, rufen Sie an Query.setCacheable (wahr). Dieser Anruf Ermöglicht der Abfrage, nach vorhandenen Daten zu suchen Cache-Ergebnisse oder fügen Sie ihre Ergebnisse hinzu der Cache, wenn es ausgeführt wird.
In diesem Fall ist dieses abnormale Verhalten und kann ich weiterhin die Annahme machen, dass Abfragen standardmäßig nicht zwischengespeichert werden?
Query-Cache ist ein wirklich einfacher Mechanismus, der Ergebnisse für bestimmte Schlüssel speichert. Im Falle einer systemeigenen Abfrage wird dieser Schlüssel Ihre Abfrage selbst und aller Parameter sein.
Der Schlüssel könnte also beispielsweise lauten:
%Vor%Aus dieser Perspektive kann jede Abfrage zwischengespeichert werden - in bestimmten Szenarien. Natürlich muss die Abfrage von Hibernate-Klassen behandelt werden, nicht direkt über JDBC-Verbindung.
Und, BTW, es ist leicht herauszufinden, ob Ihre Abfrage den Abfrage-Cache verwendet oder nicht! Es ist alles in einer Protokolldatei unter org.hibernate.cache
.
Und es gibt einen großen Haken bei all diesen - wenn Sie Ihre native Abfrage ausführen, werden alle Entitäten und Datensätze des Second-Level-Cache gelöscht! Zumindest bis zur letzten Version, die ich benutzte! Sie können also native Abfragen verwenden, aber da Hibernate nicht entscheiden kann, was sie tun, wird der Cache gelöscht, um zu verhindern, dass Datenänderungen, die von dieser Abfrage ausgeführt werden, in den Cache-Objekten widergespiegelt werden.
Es gibt also eine Menge Probleme mit dem Abfrage-Cache und Sie sollten überlegen, ob Sie diese Funktion wirklich nutzen wollen! Werfen Sie einen Blick auf diesen Artikel oder dieses . Ich versuche zu vermeiden, Abfragecaches in meiner Arbeit zu verwenden, ich verwende nur SLC für Entitäten ...