it-swarm.com.de

Wann und wie wird der Cache der zweiten Ebene im Ruhezustand verwendet?

Ich habe Probleme zu verstehen, wann der Ruhezustand den Cache der zweiten Ebene erreicht und wann der Cache ungültig wird.

Folgendes verstehe ich derzeit:

  • Der Cache der zweiten Ebene speichert Entitäten zwischen Sitzungen. Der Gültigkeitsbereich ist die SessionFactory
  • Sie müssen angeben, welche Entitäten zwischengespeichert werden sollen. Standardmäßig wird keine Entität zwischengespeichert
  • Der Abfrage-Cache speichert die Ergebnisse von Abfragen im Cache.

Was ich nicht verstehe ist

  • Wann hat der Ruhezustand diesen Cache erreicht?
  • Nehmen wir an, ich habe den Cache der zweiten Ebene eingerichtet, aber nicht das Query-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 bekommen kann. Das wäre einfach, aber auch nicht zwischenspeicherungswürdig. Was aber, 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 kann ich alle meine Kunden erreichen, wenn das Query-Caching deaktiviert ist?
  • Was würde passieren, wenn jemand einen der Kunden aktualisiert?
    • Würde dieser Kunde im Cache ungültig werden oder würden alle Kunden ungültig werden?

Oder denke ich Caching völlig falsch? Was wäre in diesem Fall die geeignetere Verwendung des Cache der zweiten Ebene? In der Dokumentation zum Ruhezustand ist überhaupt nicht klar, wie der Cache in der Realität funktioniert. Es gibt nur Anweisungen zur Einrichtung.

pdate: Ich habe verstanden, dass der Cache der zweiten Ebene (ohne Abfragecache) gut zum Laden von Daten nach IDs geeignet ist. Zum Beispiel habe ich ein Benutzerobjekt, das ich in jeder Anforderung in einer Webanwendung auf Berechtigungen überprüfen möchte. Wäre dies ein guter Fall, um den Datenbankzugriff zu reduzieren, indem der Benutzer im Cache der zweiten Ebene zwischengespeichert wird? So wie ich die Benutzer-ID in der Sitzung oder wo auch immer speichern würde und wenn ich nach Berechtigungen suchen muss, würde ich den Benutzer anhand seiner ID laden und Berechtigungen überprüfen.

83
palto

Lassen Sie uns zunächst über den Cache auf Prozessebene (oder den Cache auf der zweiten Ebene, wie er im Ruhezustand genannt wird) sprechen. Damit es funktioniert, sollten Sie

  1. cache-Provider konfigurieren
  2. teilen Sie dem Ruhezustand mit, welche Entitäten zwischengespeichert werden sollen (direkt in der Datei hbm.xml, wenn Sie diese Art der Zuordnung verwenden).

Sie teilen dem Cache-Provider mit, wie viele Objekte gespeichert werden sollen 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 Datenbank ausgewählt, die sich nicht im Cache befinden. Dies erhöht die Leistung erheblich. Es ist nützlich, wenn:

  • Sie schreiben nur über den Ruhezustand in die Datenbank (da Sie wissen müssen, wann Entitäten im Cache geändert oder ungültig gemacht werden müssen).
  • Sie lesen Objekte oft
  • Sie haben einen einzelnen Knoten und keine Replikation. Andernfalls müssen Sie den Cache selbst replizieren (verwenden Sie verteilte Caches wie JGroups), was die Komplexität erhöht und nicht so gut skaliert wie Apps ohne gemeinsame Nutzung.

Wann funktioniert der Cache?

  • Wenn Sie session.get() oder session.load() das Objekt, das zuvor ausgewählt wurde und sich im Cache befindet. Cache ist ein Speicher, in dem ID der Schlüssel und die Eigenschaften die Werte sind. Nur wenn die Möglichkeit besteht, anhand der ID zu suchen, können Sie das Treffen der Datenbank verhindern.
  • Wenn Ihre Assoziationen faul sind (oder eifrig mit Selects statt Joins beladen sind)

Aber es funktioniert nicht, wenn:

  • Wenn Sie nicht nach ID auswählen. Auch hier gilt: Der Cache der zweiten Ebene speichert eine Zuordnung der Entitäts-IDs zu anderen Eigenschaften (es werden nicht die Objekte, sondern die Daten selbst gespeichert). Wenn Ihre Suche also wie folgt aussieht: from Authors where name = :name, Ist dies nicht der Fall Hit Cache.
  • Wenn Sie HQL verwenden (auch wenn Sie where id = ? Verwenden).
  • Wenn Sie in Ihrem Mapping fetch="join" Einstellen, bedeutet dies, dass zum Laden von Assoziationen Joins überall anstelle separater select-Anweisungen verwendet werden. Der Cache auf Prozessebene funktioniert nur für untergeordnete Objekte, wenn fetch="select" Verwendet wird.
  • Selbst wenn Sie fetch="select" Haben, aber in HQL Verknüpfungen zur Auswahl von Verknüpfungen verwenden, werden diese Verknüpfungen sofort ausgegeben und überschreiben alles, was Sie in hbm.xml oder in Anmerkungen angegeben haben.

Nun zum Query Cache. Sie sollten beachten, dass es sich nicht um einen separaten Cache handelt, sondern um eine Erweiterung des Cache auf Prozessebene. Angenommen, Sie haben eine Ländereinheit. Es ist statisch, sodass Sie wissen, dass jedes Mal dieselbe Ergebnismenge angezeigt wird, wenn Sie from Country Sagen. Dies ist ein perfekter Kandidat für den Abfragecache. 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 letztere wiederum , gibt 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 from Authors So konfiguriert, dass es in einen Abfrage-Cache gestellt wird. Dies wird nicht wirksam, da der Autor häufig geändert wird. Daher sollten Sie den Abfrage-Cache nur für mehr oder weniger statische Daten verwenden.

93
  • der Cache der zweiten Ebene ist ein Schlüsselwertspeicher. Dies funktioniert nur, wenn Sie Ihre Entitäten anhand der ID erhalten
  • der Cache der zweiten Ebene wird pro Entität ungültig gemacht/aktualisiert, wenn eine Entität über den Ruhezustand aktualisiert/gelöscht wird. Es wird nicht ungültig, wenn die Datenbank auf andere Weise aktualisiert wird.
  • verwenden Sie für Abfragen (z. B. Kundenliste) den Abfrage-Cache.

In Wirklichkeit ist es nützlich, einen verteilten Schlüsselwert-Cache zu haben - das ist es, was memcached ist und Facebook, Twitter und viele mehr antreibt. Aber wenn Sie keine ID-Suche haben, ist dies nicht sehr nützlich.

38
Bozho

Spät zur Party wollte aber systematisch diese Frage beantworten, die sich viele Entwickler stellen.

Ihre Frage hier einzeln zu beantworten, ist meine Antwort.

F. Wann wird dieser Cache im Ruhezustand angezeigt?

A. Der Cache der ersten Ebene ist dem Sitzungsobjekt zugeordnet. Der Second Level Cache ist dem Session Factory-Objekt zugeordnet. Wird das Objekt in der ersten nicht gefunden, wird die zweite Ebene geprüft.

Q. Nehmen wir an, ich habe den Cache der zweiten Ebene eingerichtet, aber nicht das Query-Caching. Ich möchte meine Kunden zwischenspeichern, es gibt 50000 von ihnen. Wie kann ich die Kunden aus dem Cache abrufen?

Antwort: Das haben Sie in Ihrem Update beantwortet. Außerdem speichert der Abfragecache nur die Liste der IDs des Objekts und die Objekte mit ihren IDs werden im gleichen Cache der zweiten Ebene gespeichert. Wenn Sie also den Abfrage-Cache aktivieren, verwenden Sie dieselbe Ressource. Ordentlich, oder?

F. Ich gehe davon aus, dass ich sie anhand der ID aus dem Cache abrufen kann. Das wäre einfach, aber auch nicht zwischenspeicherungswürdig. Was aber, 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?

A. Oben beantwortet.

F. Wie kann ich alle meine Kunden erreichen, wenn das Query-Caching deaktiviert ist?

A. Oben beantwortet.

F. Was würde passieren, wenn einer der Kunden aktualisiert würde? Würde dieser Kunde im Cache ungültig werden oder würden alle Kunden ungültig werden?

A. Hibernate hat keine Ahnung, aber Sie könnten andere IMDG-/Distributed-Caches von Drittanbietern als Hibernate Second Level Cache implementieren und ungültig machen. z.B. TayzGrid ist ein solches Produkt, und ich denke, es gibt noch mehr.

11
Basit Anwer