Was sind die Caches der ersten und zweiten Ebene im Ruhezustand?

245

Kann jemand in einfachen Worten erklären, was Caching der ersten und zweiten Ebene im Ruhezustand ist?

suhair
quelle

Antworten:

300

1.1) Cache der ersten Ebene

Cache der ersten Ebene Wird immer dem Sitzungsobjekt zugeordnet . Der Ruhezustand verwendet diesen Cache standardmäßig. Hier wird eine Transaktion nach der anderen verarbeitet, dh eine Transaktion wird nicht viele Male verarbeitet. Hauptsächlich wird die Anzahl der SQL-Abfragen reduziert, die innerhalb einer bestimmten Transaktion generiert werden müssen. Das heißt, anstatt nach jeder in der Transaktion vorgenommenen Änderung zu aktualisieren, wird die Transaktion erst am Ende der Transaktion aktualisiert.

1.2) Cache der zweiten Ebene

Der Cache der zweiten Ebene wird immer mit dem Session Factory-Objekt verknüpft . Während der Ausführung der Transaktionen werden dazwischen die Objekte auf Session Factory-Ebene geladen, sodass diese Objekte für die gesamte Anwendung verfügbar sind und nicht an einen einzelnen Benutzer gebunden sind. Da die Objekte bereits in den Cache geladen sind, muss zu diesem Zeitpunkt keine Datenbanktransaktion durchgeführt werden, wenn ein Objekt von der Abfrage zurückgegeben wird. Auf diese Weise funktioniert der Cache der zweiten Ebene. Hier können wir auch den Cache auf Abfrageebene verwenden.

Zitiert von: http://javabeat.net/introduction-to-hibernate-caching/

Dennis C.
quelle
38
+1 für die Zuordnung des Caches der ersten Ebene zum Sitzungsobjekt und des Cache der zweiten Ebene zum Sitzungsfactory-Objekt. Ich musste nicht einmal weiterlesen.
Mahes
1
Cache der 1. Ebene. In den meisten Fällen wird es nicht benötigt, aber es gibt keine Möglichkeit, es loszuwerden. aber Sie sollten die ganze Zeit darüber nachdenken ..
ses
6
@ses In den meisten Fällen benötigen Sie einen Cache der ersten Ebene. Andernfalls haben Sie ein sehr schlechtes Leistungsproblem wie eine N + 1-Abfrage oder keinen eifrigen Pre-Fetch-Cache oder eine Abfrage einmal bei jedem Zugriff auf ein Attribut.
Dennis C
Normalerweise verwenden wir die Sitzung für einen sehr kurzen Zeitraum [und der Körper empfiehlt dies] / eine kurzlebige Sitzung: Wir verwenden diesen Cache in diesem Zeitraum sogar nicht. Wenn die Sitzung langlebig ist, werden Daten aus der Sitzung entfernt (z. B. beim Bearbeiten des Formulars). Es scheint, dass es nur für ein Szenario benötigt wird, wenn wir versuchen, die Abfrage-Sitzungs-API zu verwenden, während wir eine komplexe Anfrage-für-Anfrage für eine langlebige Sitzung erstellen.
Ses
1
@ TennisCheung: Der Link ist tot. Bitte aktualisieren Sie mit javabeat.net/introduction-to-hibernate-caching
NewUser
118

Im Streamline Logic- Blog finden Sie eine ziemlich gute Erklärung für das Caching der ersten Ebene .

Grundsätzlich erfolgt das Caching der ersten Ebene pro Sitzung, wobei das Caching der zweiten Ebene von mehreren Sitzungen gemeinsam genutzt werden kann.

Lomaxx
quelle
20
Das sind einfache Worte, ich weiß nicht, warum es ihnen so schwer fällt, sie zu erklären
BlackTigerX
hehe ... ja ich weiß nicht wirklich wie ich viel einfacher hätte werden können :)
lomaxx
2
das ist mir eigentlich klarer. Das erste ist pro Sitzung, während das zweite für mehrere Sitzungen ist, was für mich einfach zu bedenken ist. Können wir nicht zweimal abstimmen? : D
schwarzer Sensei
1
Es gibt kein Beispiel dafür, warum ein Cache der 1. Ebene benötigt wird. In den meisten Fällen wird es für mich überhaupt nicht benötigt. Aber Sie sollten die ganze Zeit darüber und über die Sitzung nachdenken.
Ses
Es ist 11 Jahre her seit dieser Antwort und leider existiert der Link jetzt nicht. Aber ich fand seinen Inhalt auf seiner Archiv-Webseite: web.archive.org/web/20081207044228/http://…
Golu
105

Hier einige grundlegende Erklärungen zum Cache im Ruhezustand ...

Der Cache der ersten Ebene ist dem Sitzungsobjekt zugeordnet. Der Umfang der Cache-Objekte ist der Sitzung. Sobald die Sitzung geschlossen ist, sind zwischengespeicherte Objekte für immer verschwunden. Der Cache der ersten Ebene ist standardmäßig aktiviert und kann nicht deaktiviert werden. Wenn wir eine Entität zum ersten Mal abfragen, wird sie aus der Datenbank abgerufen und im Cache der ersten Ebene gespeichert, der der Sitzung im Ruhezustand zugeordnet ist. Wenn wir dasselbe Objekt erneut mit demselben Sitzungsobjekt abfragen, wird es aus dem Cache geladen und es wird keine SQL-Abfrage ausgeführt. Die geladene Entität kann mithilfe der evict()Methode aus der Sitzung entfernt werden . Beim nächsten Laden dieser Entität wird erneut ein Datenbankaufruf ausgeführt, wenn sie mithilfe der evict()Methode entfernt wurde. Der gesamte Sitzungscache kann mithilfe der clear()Methode entfernt werden . Es werden alle im Cache gespeicherten Entitäten entfernt.

Der Cache der zweiten Ebene unterscheidet sich vom Cache der ersten Ebene, der für die globale Verwendung im Session Factory-Bereich verfügbar ist. Der Cache der zweiten Ebene wird im Bereich der Sitzungsfactory erstellt und kann in allen Sitzungen verwendet werden, die mit dieser bestimmten Sitzungsfactory erstellt wurden. Dies bedeutet auch, dass nach dem Schließen der Session Factory der gesamte damit verbundene Cache stirbt und der Cache-Manager ebenfalls geschlossen wird. Wenn eine Sitzung im Ruhezustand versucht, eine Entität zu laden, sucht sie an erster Stelle nach einer zwischengespeicherten Kopie der Entität im Cache der ersten Ebene (die einer bestimmten Sitzung im Ruhezustand zugeordnet ist). Wenn eine zwischengespeicherte Kopie der Entität im Cache der ersten Ebene vorhanden ist, wird sie als Ergebnis der Lademethode zurückgegeben. Wenn sich im Cache der ersten Ebene keine zwischengespeicherte Entität befindet, wird der Cache der zweiten Ebene nach der zwischengespeicherten Entität gesucht. Wenn der Cache der zweiten Ebene eine zwischengespeicherte Entität hat, wird diese als Ergebnis der Lademethode zurückgegeben. Aber, Vor dem Zurückgeben der Entität wird sie auch im Cache der ersten Ebene gespeichert, sodass beim nächsten Aufruf der Lademethode für die Entität die Entität aus dem Cache der ersten Ebene selbst zurückgegeben wird und nicht erneut in den Cache der zweiten Ebene gewechselt werden muss. Wenn die Entität nicht im Cache der ersten Ebene und auch im Cache der zweiten Ebene gefunden wird, wird die Datenbankabfrage ausgeführt und die Entität in beiden Cache-Ebenen gespeichert, bevor sie als Antwort von zurückgegeben wirdload() Methode.

Creditto
quelle
2
Hervorragende Erklärung! Wenn Sie einige Sequenzdiagramme zeichnen könnten, wäre es fantastisch !!!
Adelin
gründliche und nette Erklärung
ManishS
1
Wenn Sie das, was Sie bereits wissen, überarbeiten möchten, sind die beiden oben genannten Antworten von Dennis C und Iomaxx großartig, sehr prägnant und leicht zu merken. Wenn Sie jedoch nach einer Erklärung für den Unterschied suchen, wenn Sie ihn noch nicht kennen, ist diese Antwort viel besser!
The Student Soul
Tolle Erklärung !!
Blu3
17

Dies ist eine sehr häufige Frage, daher basiert diese Antwort auf diesem Artikel, den ich in meinem Blog geschrieben habe.

Cache der ersten Ebene

Der Ruhezustand versucht, den Persistenzkontext bis zum letztmöglichen Moment aufzuschieben. Wie ich in diesem Artikel erklärt habe , ist diese Strategie traditionell als Transaktions-Write-Behind bekannt.

Das Write-Behind bezieht sich eher auf das Leeren des Ruhezustands als auf logische oder physische Transaktionen. Während einer Transaktion kann der Flush mehrmals auftreten.

Geben Sie hier die Bildbeschreibung ein

Die gelöschten Änderungen sind nur für die aktuelle Datenbanktransaktion sichtbar. Bis die aktuelle Transaktion festgeschrieben ist, ist keine Änderung für andere gleichzeitige Transaktionen sichtbar.

Aufgrund des Caches der ersten Ebene kann Hibernate mehrere Optimierungen vornehmen:

Cache der zweiten Ebene

Eine ordnungsgemäße Caching-Lösung müsste sich über mehrere Hibernate-Sitzungen erstrecken. Aus diesem Grund unterstützt Hibernate auch einen zusätzlichen Cache der zweiten Ebene.

Der Cache der zweiten Ebene ist an den SessionFactory-Lebenszyklus gebunden, sodass er nur zerstört wird, wenn der SessionFactorygeschlossen wird (normalerweise, wenn die Anwendung heruntergefahren wird). Der Cache der zweiten Ebene ist in erster Linie auf Entitäten ausgerichtet, unterstützt jedoch auch eine optionale Abfrage-Caching-Lösung.

Weitere Informationen finden Sie in diesem Artikel .

Vlad Mihalcea
quelle
3

Standardmäßig verwendet NHibernate das Caching der ersten Ebene, das auf Sitzungsobjekten basiert. Wenn Sie jedoch in einer Umgebung mit mehreren Servern ausgeführt werden, ist der Cache der ersten Ebene möglicherweise zusammen mit einigen Leistungsproblemen nicht sehr skalierbar. Dies liegt an der Tatsache, dass sehr häufig Daten in die Datenbank übertragen werden müssen, da die Daten auf mehrere Server verteilt sind. Mit anderen Worten, NHibernate bietet einen einfachen, nicht so ausgefeilten In-Process-L1-Cache. Es bietet jedoch keine Funktionen, die eine Caching-Lösung haben muss, um einen nennenswerten Einfluss auf die Anwendungsleistung zu haben.

Die Frage bei all diesen Problemen ist daher die Verwendung eines L2-Caches, der den Session Factory-Objekten zugeordnet ist. Es reduziert die zeitaufwändigen Fahrten zur Datenbank und erhöht so letztendlich die Antwortzeit der App.

Ravian
quelle
1

First Level Cache

Das Sitzungsobjekt enthält die Cache-Daten der ersten Ebene. Es ist standardmäßig aktiviert. Die Cache-Daten der ersten Ebene sind nicht für die gesamte Anwendung verfügbar. Eine Anwendung kann viele Sitzungsobjekte verwenden.

Cache der zweiten Ebene

Das SessionFactory-Objekt enthält die Cache-Daten der zweiten Ebene. Die im Cache der zweiten Ebene gespeicherten Daten stehen der gesamten Anwendung zur Verfügung. Aber wir müssen es explizit aktivieren.

Lockerer
quelle
-4

In einem Cache der zweiten Ebene können Domänen-Hbm-Dateien vom Schlüssel veränderbar sein und den Wert false haben. In dieser Domänenklasse bleibt beispielsweise ein Teil der Dauer eines Tages als universelle Wahrheit konstant. Daher kann es anwendungsübergreifend als unveränderlich markiert werden.

Prakash Bayas
quelle