Abfragecache im Ruhezustand - für Objekte, die sich nicht im Cache der 2. Ebene befinden - riskant? sinnvoll? schlechte Übung?

Im Zusammenhang damitFrage

Prämisse:

Dies sind meine Annahmen, basierend auf meiner Lektüre, Erfahrung und meinem Verständnis. Wenn sie falsch sind, kommentieren Sie sie bitte und ich bearbeite die Frage.

Der Abfragecache ist meistens zusammen mit dem Cache der zweiten Ebene gutDer Abfragecache speichert die Bezeichnerergebnisse von Abfragen + Parametern zwischenDer Abfragecache ist riskant, wenn die Datenbank geändert und nicht im Cache gespeichert wurde

Frage:

Ich habe ein Objekt, das sich nicht im Cache der 2. Ebene befindet. Aufgrund einer schlechten Programmierung oder anderer Einschränkungen wird der Code, der das Objekt lädt, mehrmals in derselben Ruhezustandssitzung aufgerufen. Der Abruf verwendet eine HQL-Suchabfrage, z.

 hibernateTemplate.find("from Foo f where f.bar > ?", bar);

Wenn der obige Code vor dem Hinzufügen des Abfragecaches N-mal in derselben Ruhezustandssitzung aufgerufen wurde, wurden N Treffer in der Datenbank gefunden

Dann wollte ich sehen, was passiert, wenn ich den Abfrage-Cache hinzufüge:

 Query query = session.createQuery("from Foo f where f.bar > ?");
 query.setCacheable(true);
 query.setParameter(bar);
 query.list();

Als ich den Abfrage-Cache hinzufügte, habe ich festgestellt, dass der Ruhezustand während derselben Sitzung nicht mehr N-mal die Datenbank erreicht, sondern nur noch einmal pro Sitzung.

Meine erste Annahme ist also, dass der Ruhezustand zuerst im Sitzungscache und dann im Cache der zweiten Ebene sucht. Ist diese Annahme richtig?Ich gehe auch davon aus, dass, wenn das Objekt (Foo), die sich nicht im Cache der 2. Ebene befindet, in der Datenbank geändert wurde, dann gibt der Abfrage-Cache im Sitzungsübergreifenden Bereich die falschen Bezeichner und damit die falschen Objekte zurück. Ist das korrekt?Ist es dann sicher zu sagen, dass die Verwendung des Abfrage-Caches für Abfragen, die unveränderliche Informationen enthalten, auch für nicht zwischengespeicherte 2L-Objekte eine gute Praxis ist? (z. B. eine Abfrage, dass die where-Klausel eine Bedingung enthält, die immer die gleichen Ergebnisse zurückgibt, z. B. "select p.ser_num where p.id =?", wenn sich die Paare ser_num und id nach der Erstellung nicht ändern)

Übrigens in der verwandtenFrage Es wird behauptet, dass der Abfrage-Cache im Sitzungs-Cache-Bereich nicht funktioniert. Verstehe ich diese Behauptung falsch oder etwas anderes?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage