it-swarm-eu.dev

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

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

231
suhair

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 mehrmals 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 eine Aktualisierung durchzuführen, wird die Transaktion erst am Ende der Transaktion aktualisiert.

1.2) Cache der zweiten Ebene

Cache der zweiten Ebene wird immer dem Session Factory-Objekt zugeordnet. Während der Ausführung der Transaktionen werden 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 ausgefü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/

289
Dennis C

Im Streamline Logic Blog gibt es eine ziemlich gute Erklärung für Caching auf der ersten Ebene.

Grundsätzlich erfolgt die Zwischenspeicherung der ersten Ebene auf Sitzungsebene, wobei die Zwischenspeicherung der zweiten Ebene für mehrere Sitzungen gemeinsam genutzt werden kann.

114
lomaxx

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

Der Cache der ersten Ebene ist dem Sitzungsobjekt zugeordnet. Der Umfang der Cache-Objekte hängt von der Sitzung ab. 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 Ruhezustandssitzung 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 mit der Methode evict() aus der Sitzung entfernt werden. Beim nächsten Laden dieser Entität wird erneut eine Datenbank aufgerufen, wenn sie mit der Methode evict() entfernt wurde. Der gesamte Sitzungscache kann mit der Methode clear() 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 Bereich der Sitzungsfactory 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 Sitzungsfactory der gesamte damit verbundene Cache abstürzt und der Cache-Manager ebenfalls geschlossen wird. Immer wenn eine Sitzung im Ruhezustand versucht, eine Entität zu laden, sucht sie an allererster 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. Befindet sich keine zwischengespeicherte Entität im Cache der ersten Ebene, wird der Cache der zweiten Ebene nach zwischengespeicherten Entitäten durchsucht. Wenn der Cache der zweiten Ebene eine zwischengespeicherte Entität hat, wird sie als Ergebnis der Lademethode zurückgegeben. Bevor die Entität zurückgegeben wird, wird sie jedoch auch im Cache der ersten Ebene gespeichert, sodass der nächste Aufruf der Lademethode für die Entität die Entität aus dem Cache der ersten Ebene selbst zurückgibt und kein erneuter Wechsel in den Cache der zweiten Ebene erforderlich ist. Wenn die Entität nicht auch im Cache der ersten und zweiten Ebene gefunden wird, wird eine Datenbankabfrage ausgeführt und die Entität in beiden Cache-Ebenen gespeichert, bevor sie als Antwort der Methode load() zurückgegeben wird.

97
Creditto

Cache der ersten Ebene

Hibernate versucht, das Löschen des Persistenzkontexts bis zum letzten möglichen Moment aufzuschieben. Wie ich in diesem Artikel erklärt habe, ist diese Strategie traditionell als Transaktions-Write-Behind bekannt.

Das Write-Behind hängt eher mit dem Ruhezustand als mit einer logischen oder physischen Transaktion zusammen. Während einer Transaktion kann das Leeren mehrmals auftreten.

enter image description here

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 Cache der ersten Ebene kann Hibernate verschiedene Optimierungen vornehmen:

Cache der zweiten Ebene

Eine ordnungsgemäße Caching-Lösung muss 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 und wird daher nur zerstört, wenn SessionFactory geschlossen wird (normalerweise, wenn die Anwendung beendet wird). Der Cache der zweiten Ebene ist in erster Linie auf Entitäten ausgerichtet, unterstützt jedoch auch eine optionale Query-Caching-Lösung.

Weitere Informationen finden Sie unter dieser Artikel .

9
Vlad Mihalcea

standardmäßig verwendet NHibernate das auf Sitzungsobjekten basierende Zwischenspeichern der ersten Ebene. Wenn Sie jedoch in einer Umgebung mit mehreren Servern arbeiten, ist der Cache der ersten Ebene möglicherweise nicht sehr skalierbar, und es treten einige Leistungsprobleme auf. Dies liegt an der Tatsache, dass die Datenbank sehr häufig durchsucht werden muss, da die Daten auf mehrere Server verteilt werden. Mit anderen Worten, NHibernate bietet einen einfachen, nicht so ausgefeilten L1-Cache im laufenden Betrieb. Es bietet jedoch keine Funktionen, die eine Caching-Lösung auf die Anwendungsleistung auswirken muss.

die Frage all dieser Probleme ist also die Verwendung eines L2-Caches, der den Session-Factory-Objekten zugeordnet ist. Dadurch werden die zeitaufwendigen Fahrten zur Datenbank reduziert und letztendlich die Antwortzeiten der App erhöht.

3
Ravian

First Level Cache

Das Sitzungsobjekt enthält die Cache-Daten der ersten Ebene. Es ist standardmäßig aktiviert. Die Cache-Daten der ersten Ebene stehen nicht der gesamten Anwendung zur Verfügung. Eine Anwendung kann viele Sitzungsobjekte verwenden.

Second Level Cache

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.

1
Looser