Ich habe Probleme zu verstehen, wann der Ruhezustand den Cache der zweiten Ebene erreicht und wann er den Cache ungültig macht.
Folgendes verstehe ich derzeit:
- Der Cache der zweiten Ebene speichert Entitäten zwischen Sitzungen. Der Bereich ist die SessionFactory
- Sie müssen angeben, welche Entitäten zwischengespeichert werden sollen. Standardmäßig wird keine Entität zwischengespeichert
- Der Abfragecache speichert die Ergebnisse von Abfragen im Cache.
Was ich nicht verstehe ist
- Wann trifft der Ruhezustand diesen Cache?
- Angenommen, ich habe den Cache der zweiten Ebene eingerichtet, aber nicht das Abfrage-Caching. Ich möchte meine Kunden zwischenspeichern, es gibt 50000 von ihnen. Wie kann ich die Kunden aus dem Cache abrufen?
- Ich gehe davon aus, dass ich sie per ID aus dem Cache abrufen kann. Das wäre einfach, aber auch nicht zwischenspeicherwürdig. Aber was ist, wenn ich mit all meinen Kunden rechnen möchte? Angenommen, ich möchte eine Liste der Kunden anzeigen. Wie würde ich dann auf sie zugreifen?
- Wie würde ich alle meine Kunden erreichen, wenn das Zwischenspeichern von Abfragen deaktiviert ist?
- Was würde passieren, wenn jemand einen der Kunden aktualisieren würde?
- Würde dieser Kunde im Cache ungültig werden oder würden alle Kunden ungültig werden?
Oder denke ich, dass Caching völlig falsch ist? Was wäre in diesem Fall angemessener für die Verwendung des Cache der zweiten Ebene? Die Dokumentation zum Ruhezustand ist überhaupt nicht klar, wie der Cache in der Realität funktioniert. Es gibt nur Anweisungen zum Einrichten.
Update: Ich habe verstanden, dass der Cache der zweiten Ebene (ohne Abfrage-Cache) gut zum Laden von Daten anhand von IDs geeignet ist. Zum Beispiel habe ich ein Benutzerobjekt, das ich in jeder Anforderung in einer Webanwendung auf Berechtigungen prüfen möchte. Wäre dies ein guter Fall, um den Datenbankzugriff durch Zwischenspeichern des Benutzers im Cache der zweiten Ebene zu reduzieren? Als würde ich die Benutzer-ID in der Sitzung speichern oder wo und wann immer ich nach Berechtigungen suchen muss, würde ich den Benutzer anhand seiner ID laden und Berechtigungen überprüfen.
Antworten:
Lassen Sie uns zunächst über den Cache auf Prozessebene (oder den Cache der zweiten Ebene, wie sie im Ruhezustand genannt werden) sprechen. Damit es funktioniert, sollten Sie
Sie teilen dem Cache-Anbieter mit, wie viele Objekte er speichern soll und wann / warum sie ungültig werden sollen. Angenommen, Sie haben eine Buch- und eine Autorenentität. Jedes Mal, wenn Sie sie aus der Datenbank abrufen, werden nur diejenigen aus der tatsächlichen Datenbank ausgewählt, die sich nicht im Cache befinden. Dies erhöht die Leistung erheblich. Es ist nützlich, wenn:
Wann funktioniert der Cache?
session.get()
odersession.load()
das zuvor ausgewählte Objekt sich im Cache befinden. Cache ist ein Speicher, in dem ID der Schlüssel und die Eigenschaften die Werte sind. Nur wenn die Möglichkeit besteht, nach ID zu suchen, können Sie das Schlagen der Datenbank vermeiden.Aber es funktioniert nicht, wenn:
from Authors where name = :name
dann schlagen Sie nicht auf den Cache.where id = ?
).fetch="join"
, dass zum Laden von Zuordnungen Verknüpfungen überall anstelle separater select-Anweisungen verwendet werden. Der Cache auf Prozessebene funktioniert nur bei untergeordneten Objekten, wenn erfetch="select"
verwendet wird.fetch="select"
in HQL getan haben, verwenden Sie Verknüpfungen, um Zuordnungen auszuwählen. Diese Verknüpfungen werden sofort ausgegeben und überschreiben alles, was Sie in hbm.xml oder Anmerkungen angegeben haben.Nun zum Abfrage-Cache. Sie sollten beachten, dass es sich nicht um einen separaten Cache handelt, sondern um eine Ergänzung zum Cache auf Prozessebene. Angenommen, Sie haben eine Länderentität. Es ist statisch, sodass Sie wissen, dass jedes Mal dieselbe Ergebnismenge angezeigt wird, wenn Sie sagen
from Country
. Dies ist ein perfekter Kandidat für den Abfrage-Cache. Er speichert eine Liste von IDs in sich selbst. Wenn Sie das nächste Mal alle Länder auswählen, wird diese Liste an den Cache auf Prozessebene zurückgegeben, und dieser gibt wiederum Objekte für jede ID zurück da diese Objekte bereits im Cache der 2. Ebene gespeichert sind. Der Abfragecache wird jedes Mal ungültig, wenn sich etwas im Zusammenhang mit der Entität ändert. Angenommen, Sie haben konfiguriertfrom Authors
, dass sie in einen Abfrage-Cache gestellt werden sollen. Dies ist nicht effektiv, da der Autor häufig wechselt.quelle
In der Realität ist es nützlich, einen verteilten Schlüsselwert-Cache zu haben - genau das ist memcached und unterstützt Facebook, Twitter und viele mehr. Wenn Sie jedoch keine Suche nach ID haben, ist dies nicht sehr nützlich.
quelle
Spät zur Party, wollte aber systematisch diese Frage beantworten, die viele Entwickler stellen.
Ihre Frage hier einzeln zu beantworten, ist meine Antwort.
A. Der Cache der ersten Ebene ist dem Sitzungsobjekt zugeordnet . Der Cache der zweiten Ebene ist dem Session Factory-Objekt zugeordnet . Wenn das Objekt in der ersten nicht gefunden wird, wird die zweite Ebene überprüft.
A. Sie haben diese Antwort in Ihrem Update erhalten. Außerdem speichert der Abfragecache nur die Liste der IDs des Objekts, und diese Objekte mit ihren IDs werden im selben Cache der zweiten Ebene gespeichert . Wenn Sie also den Abfragecache aktivieren, verwenden Sie dieselbe Ressource. Ordentlich richtig?
A. Oben beantwortet.
A. Oben beantwortet.
A. Der Ruhezustand hat keine Ahnung, aber Sie könnten andere IMDG / verteilte Caches von Drittanbietern verwenden, um sie als Cache der zweiten Ebene im Ruhezustand zu implementieren und sie ungültig zu machen. zB TayzGrid ist ein solches Produkt und es gibt mehr, denke ich.
quelle
Der Cache der zweiten Ebene im Ruhezustand ist etwas schwierig zu verstehen und zu implementieren. Folgendes können wir anhand Ihrer Fragen sagen:
Wie Sie vorschlagen, wird der L2-Cache im Ruhezustand (falls aktiviert; standardmäßig nicht aktiviert) erst nach dem L1-Cache abgefragt. Dies ist ein Schlüsselwert-Cache, dessen Daten über mehrere Sitzungen hinweg erhalten bleiben.
Das Zwischenspeichern von Abfragen ist für diesen Anwendungsfall am besten geeignet, da die Kundendaten statisch sind und aus einer relationalen Datenbank abgerufen werden.
Dies hängt von der spezifischen Cache-Strategie für den Ruhezustand ab, die Sie verwenden. Der Ruhezustand hat tatsächlich vier verschiedene Cache-Strategien:
READ_ONLY : Objekte ändern sich nicht einmal im Cache.
NONSTRICT_READ_WRITE : Objekte ändern sich (eventuell), nachdem der entsprechende Datenbankeintrag aktualisiert wurde. Dies garantiert eine eventuelle Konsistenz.
READ_WRITE : Objekte ändern sich (sofort), nachdem der entsprechende Datenbankeintrag aktualisiert wurde. Dies garantiert eine starke Konsistenz durch Verwendung von "weichen" Schlössern.
TRANSAKTIONAL : Objekte ändern sich mithilfe verteilter XA-Transaktionen, um die Datenintegrität sicherzustellen. Dies garantiert entweder den vollständigen Erfolg oder das Zurücksetzen aller Änderungen. In allen vier Fällen würde das Aktualisieren eines einzelnen Datenbankeintrags jedoch nicht die gesamte Liste der Kunden im Cache ungültig machen. Der Ruhezustand ist etwas schlauer :)
Weitere Informationen zur Funktionsweise des L2-Caching im Ruhezustand finden Sie im Artikel „Was ist der L2-Cache im Ruhezustand?“ Oder im ausführlichen Artikel „ Caching im Ruhezustand mit Redis“
quelle