Ruhezustands-Cache: Werden Objekte von einer zwischengespeicherten Abfrage zurückgegeben, die im L2-Cache gespeichert ist?

8

Wir verwenden hibernate4 und ehcache in unserem Projekt. Wir arbeiten hauptsächlich an unveränderlichen Objekten, daher ist das Caching ein Feature, das in unsere Anwendung passt. Beim Versuch, den Abfragecache zu aktivieren, ist das folgende Problem aufgetreten:

Angenommen, wir haben die folgende Entität:

%Vor%

und die Abfrage:

%Vor%

Der Abfragecache timeToLive ist auf etwa 3/4 des Dog timeToLive gesetzt. Hier ist das Szenario (bitte korrigieren Sie mich, wenn ich eine falsche Annahme gemacht habe):

  1. Wenn die Abfrage das erste Mal aufgerufen wird (vorausgesetzt, der Cache ist leer), wird sie ausgeführt, und die zurückgegebenen Dog-Instanzen werden im Cache der zweiten Ebene gespeichert. Außerdem werden die Dog-IDs im Abfragecache gespeichert.
  2. Beim zweiten Aufruf der Abfrage (die Dog-IDs befinden sich im Abfrage-Cache und die Dog-Objekte befinden sich im L2-Cache) funktioniert alles einwandfrei. Der Abfragecache gibt die IDs zurück und die Hunde werden aus L2 geholt.
  3. Wenn der Abfragecache abläuft (aber der L2-Cache noch gültig ist), wird die Abfrage erneut ausgeführt und speichert die Dog-IDs.
  4. Jetzt läuft der L2-Cache für das Dog-Objekt ab und alle Objekte werden aus dem Cache entfernt. Im Abfragecache sind die IDs immer noch im Cache gespeichert. Daher ruft Hibernate die Hundobjekte nacheinander ab , was ewig dauert.

Der 3. Punkt nervt mich. Der Abfragecache wurde ungültig gemacht und in der Datenbank erneut ausgeführt, wobei die Dog-Objekte abgerufen wurden, die Dog-Objekte jedoch nicht im L2-Cache aktualisiert wurden. Es sieht so aus, als ob die Abfrage nur die Hunde-IDs im Abfrage-Cache, nicht aber den L2-Cache aktualisiert hat.

Gibt es eine Möglichkeit, die Abfrage zu zwingen, auch den L2-Cache zu aktualisieren? Vielleicht ist dieses Szenario anders zu behandeln?

    
Wojciech Górski 20.02.2013, 18:15
quelle

3 Antworten

2

Siehe Second Level Cache ist für Object / Pojos, die Sie angeben, um zwischengespeichert zu werden. Der Abfragecache wird jedoch für bestimmte Abfragen erstellt. So scheint es natürlich, dass beide nicht verwandt sind und der Cache der zweiten Ebene nicht aktualisiert wird, wenn der Abfrage-Cache aktualisiert wird. Deshalb gibt es für beide eine andere Konfiguration. Sie können entweder die Hibernate-Dokumentation oder diesen Link oder diesen Link kann dir helfen, Dinge zu verstehen.

    
Ajay Bhojak 25.07.2013 12:04
quelle
1

Ich habe das versucht und in der Vergangenheit für mich gearbeitet, um den L2 Cache zu säubern

%Vor%

Hoffe es hilft

    
victoriza 25.07.2013 09:58
quelle
0

In meinem Fall deaktiviere ich die minimale Put-Einstellung im Ruhezustand und dann aktualisiert der Abfrage-Cache jedes Mal automatisch den zugehörigen Cache der zweiten Ebene, wenn SQL ausgegeben wird.

Ich denke, das ist die Lösung für Ihre Frage, "um die Abfrage zu zwingen, auch den L2-Cache zu aktualisieren" (Das behebt mich auch eine lange Zeit .....)

%Vor%     
AlexN3D YouTube 12.05.2015 01:43
quelle

Tags und Links