2017-03-02 5 views
0

Ist es möglich, Schlüssel zur Karte des Hibernate Query Cache manuell hinzuzufügen?Kann die Hibernate-Query-Cache-Map manuell Werte hinzufügen?

Bitte lesen Sie meine Argumentation unter:

habe ich eine Abfrage wie folgt:

from UserTable as u where u.username="Dan" and password="123456" 

Und das Ergebnis Abfrage gibt einen Benutzer mit der ID 3

Die erste Abfrage nur wird einmal ausgeführt und in den Abfragecache geladen.

Jetzt, während das erste Ergebnis zwischengespeichert wird, gebe ich die folgende Abfrage

from UserTable as u where u.id=3 

Welche den gleichen Benutzer, zurückkehren wird, aber wie ich aus verschiedener Website gelernt, like so, werden die Abfragen als behandelt werden verschiedene Abfragen vollständig durch den Cache (bitte korrigieren Sie mich, wenn ich mich natürlich irre).

Gibt es eine Möglichkeit, Hibernate mitzuteilen, dass beide Abfragen die gleichen Daten zurückgeben? Dadurch wird verhindert, dass der Ruhezustand das zweite Mal auf die Datenbank trifft.

Eine theoretische Lösung, die ich mir vorstellen kann, ist, nach der ersten Abfrage die zweite Abfrage mit dem ersten Abfragewert in den Cache zu injizieren, aber ich bin mir nicht sicher, ob das möglich ist.

Antwort

2

Gibt es eine Möglichkeit, Hibernate mitzuteilen, dass beide Abfragen die gleichen Daten zurückgeben? Nr.

Dies wird speichern Winterschlaf von der Datenbank das zweite Mal. Es sollte keine große Sache sein. Das Query-Caching ist für Abfragen gedacht, die häufig ausgeführt werden, sodass eine Ausführung mehr keinen großen Unterschied machen sollte.

Eine theoretische Lösung, die ich mir vorstellen kann, ist, nach der ersten Abfrage die zweite Abfrage mit dem ersten Abfragewert in den Cache zu injizieren, aber ich bin mir nicht sicher, ob das möglich ist. Theoretisch ist es möglich, aber es wäre sehr komplex, manuell zu implementieren (Cache-Entry-Format, Zeitstempel-Cache, ordnungsgemäße Synchronisierung mit anderen Sitzungen gleichzeitig).

Die Lösung für Ihr spezifisches Beispiel ist das Aktivieren des Second-Level-Caching für UserTable Entität, und laden Sie den Benutzer mit session.load(UserTable.class, id) statt die zweite Abfrage auszuführen. Auf diese Weise wird der Benutzer aus dem L2-Cache abgerufen, da er in die erste Abfrage geladen wurde.

Wichtig: Wenn Sie viele Aufzeichnungen UserTable Einheit haben, weder alle Ihre Anfragen noch UserTable Einheit sollte zwischengespeichert werden. Werfen Sie einen Blick auf diese blog für einen Überblick und Best Practices über L2-Caching.

Verwandte Themen