Hibernate Cache-Strategie
-
11-09-2019 - |
Frage
Wie kann ich entscheiden, welche zu verwenden CacheConcurrencyStrategy
zu?
-
NonstrictReadWriteCache
, -
ReadOnlyCache
, -
ReadWriteCache
, -
TransactionalCache
.
Ich lese https: //www.hibernate. org / hib_docs / v3 / api / org / hibernate / cache / CacheConcurrencyStrategy.html , aber erklärt nicht genug im Detail.
Lösung
Die Dokumentation Hibernate hat einen ziemlich guten Job, sie zu definieren:
19.2.2. Strategie: nur lesen
Wenn Ihre Anwendung zu lesen, aber Ändern Sie nicht, Instanzen einer persistenten Klasse, eine Nur-Lese-Cache kann verwendet werden. Dies ist die einfachste und optimale Durchführung Strategie. Es ist sogar sicher zur Verwendung in einem Cluster.
19.2.3. Strategie: Lesen / Schreiben
Wenn die Anwendung muss aktualisiert werden Daten, ein Cache-Lese-Schreib könnte sein, angemessen. Diese Cache-Strategie sollte nie wenn serializable verwendet werden Transaktionsisolationsstufe ist erforderlich. Wenn der Cache in einem benutzten JTA-Umgebung müssen Sie die angeben Eigentum
hibernate.transaction.manager_lookup_class
und die Benennung einer Strategie für den Erhalt die JTATransactionManager
. In anderen Umgebungen, sollten Sie sicherstellen, dass die Transaktion ist abgeschlossen, wennSession.close()
oderSession.disconnect()
aufgerufen. Wenn du will diese Strategie in einem verwenden, Cluster, sollten Sie sicherstellen, dass die zugrunde liegende Cache-Implementierung Verriegelungs unterstützt. Die eingebaute Cache Anbieter nicht unterstützen Verriegelung.19.2.4. Strategie: nicht strikt Lese- / Schreib
Wenn die Anwendung nur gelegentlich benötigt, um Daten zu aktualisieren (das heißt, wenn es extrem unwahrscheinlich, dass zwei Transaktionen versuchen würden, die aktualisieren gleiches Element gleichzeitig), und ein strenges Transaktionsisolations nicht erforderlich ist, eine nicht strikte-Lese-Schreib-Cache könnte sein, angemessen. Wenn der Cache in einem benutzten JTA-Umgebung, müssen Sie angeben,
hibernate.transaction.manager_lookup_class
. In anderen Umgebungen, sollten Sie sicherzustellen, dass die Transaktion abgeschlossen, wennSession.close()
oderSession.disconnect()
genannt wird.19.2.5. Strategie: Transaktions
Die Transaktionscache-Strategie bietet Unterstützung für voll Transaktionscache-Anbieter wie JBoss TreeCache. Ein solcher Cache kann nur in einer JTA-Umgebung verwendet werden und Sie müssen angeben,
hibernate.transaction.manager_lookup_class
.
Mit anderen Worten:
-
Read-only: Nützlich für Daten, die ist lesen häufig aber nie aktualisiert (z Referenzdaten wie Länder). Es ist einfach. Es hat die besten Leistungen aller (offensichtlich).
-
Schreiben / Lesen: Wünschenswert, wenn Ihre Daten Bedürfnisse aktualisiert werden . Aber es bietet keine SERIALIZABLE Isolationsstufe, Phantom liest auftreten können (man am Ende einer Transaktion etwas sehen kann das war nicht da zu Beginn). Es hat mehr Aufwand als schreibgeschützt.
-
nicht strikt lesen / schreiben: Alternativ, wenn es unwahrscheinlich, zwei separate Transaktion Threads ist könnte das gleiche Objekt aktualisieren, können Sie die nicht strikte-Lese-Schreib-Strategie verwenden. Es hat weniger Overhead als read-write. Dies ist für Daten nützlich, die sind selten aktualisiert .
-
Transactional: Wenn Sie ein vollständig transaktionale Cache. Nur geeignet in einer JTA Umgebung.
Also, hängt davon ab, die richtige Strategie entschieden, dass die Daten aktualisiert werden oder nicht, die Häufigkeit des Updates und die Isolationsstufe erforderlich. Wenn Sie nicht wissen, wie diese Fragen für die Daten, die Sie im Cache setzen wollen beantworten, fragen Sie vielleicht eine gewisse Unterstützung von einem DBA.
Andere Tipps
READ_ONLY: Wird nur für Unternehmen, die sich nie ändern (Ausnahme wird ausgelöst, wenn ein Versuch, ein solches Unternehmen zu aktualisieren wird). Es ist sehr einfach und performant. Sehr gut geeignet für einige statische Referenzdaten, die nicht ändern.
NONSTRICT_READ_WRITE: Cache wird nach einer Transaktion aktualisiert, dass die betroffenen Daten geändert hat, verpflichtet. Somit wird eine starke Konsistenz nicht garantiert und es gibt ein kleines Zeitfenster, in dem veralteten Daten aus dem Cache erhalten werden. Diese Art von Strategie ist für Anwendungsfälle geeignet, die Eventual Consistency tolerieren kann.
READ_WRITE: Diese Strategie garantiert starke Konsistenz, die es durch die Verwendung ‚weiche‘ Sperren erreicht: Wenn eine im Cache gespeicherte Einheit aktualisiert wird, eine weiche Sperre im Cache für diese Entität gespeichert ist, als auch, was ist freigegeben, nachdem die Transaktion festgeschrieben. Alle gleichzeitigen Transaktionen, die weich gesperrten Einträge zugreifen werden die entsprechenden Daten direkt aus der Datenbank abgerufen werden.
TRANSACTIONAL: Cache Änderungen werden in verteilten XA-Transaktionen durchgeführt. Eine Änderung in einer zwischengespeicherten Entität ist entweder festgeschrieben oder in beide Datenbank und Cache in derselben XA-Transaktion rückgängig gemacht.
Beim Lesen API-Dokumentation ist gut, aber Sie sollten auch die Dokumentation (its awesome) lesen Sie auch, Second Level Cache -. Strategies
-
Transactional -. Verwenden Sie diese Strategie für schreib meist Daten, bei denen es ist wichtig, veraltete Daten in gleichzeitigen Transaktionen zu verhindern, in dem seltenen Fall eines Updates
-
Read-Write -. Auch mit dieser Strategie für schreib meist Daten, bei denen es ist wichtig, veraltete Daten in gleichzeitigen Transaktionen zu verhindern, in dem seltenen Fall eines Updates
-
nicht strikt-read-write - Diese Strategie macht keine Garantie für die Konsistenz zwischen dem Cache und der Datenbank. Verwenden Sie diese Strategie, wenn Daten kaum verändert und eine kleine Wahrscheinlichkeit von veralteten Daten ist nicht von entscheidender Bedeutung.
-
Read-only - Eine Gleichzeitigkeit Strategie geeignet für Daten, die sich nie ändert. Verwenden Sie es für Referenzdaten nur.
Hope dies macht den Zweifel!