13 Stimmen

Strict vs. NonStrict NHibernate-Cache-Gleichzeitigkeitsstrategien

In dieser Frage geht es um den Unterschied zwischen ReadWrite- und NonStrictReadWrite-Cache-Gleichzeitigkeitsstrategien für den Cache der zweiten Ebene von NHibernate.

Soweit ich weiß, ist der Unterschied zwischen diesen beiden Strategien relevant, wenn Sie eine verteilte repliziert Cache - nonstrict garantiert nicht, dass ein Cache genau denselben Wert hat wie ein anderer Cache, während strict read/write dies gewährleisten sollte - vorausgesetzt, der Cache-Anbieter sorgt für die entsprechende verteilte Sperrung.

Der Teil, den ich nicht verstehe, ist, wie die strikte vs. nicht-strikte Unterscheidung relevant ist, wenn Sie einen einzelnen Cache oder einen verteilten Cache haben unterteilt (nicht replizierter) Cache. Kann das relevant sein? Mir scheint, dass der Zeitstempel-Cache in nicht replizierten Szenarien sicherstellt, dass keine veralteten Ergebnisse geliefert werden. Wenn es relevant sein kann, würde ich gerne ein Beispiel sehen.

19voto

Nick Craver Punkte 609016

Was Sie vermuten ist richtig, in einer Umgebung mit einem einzigen Ziel/Thread gibt es kaum einen Unterschied. Wenn Sie sich jedoch die Cache-Provider ansehen, ist auch in einem Multi-Thread-Szenario einiges los.

Die Art und Weise, wie ein Objekt aus seinem geänderten Zustand wieder in den Zwischenspeicher aufgenommen wird, ist in der nicht-strikten Version anders. Wenn Ihr Objekt zum Beispiel viel schwerer zu laden ist, Sie es aber nach einer Aktualisierung neu laden möchten, anstatt den nächsten Benutzer mit der Rechnung zu belasten, dann werden Sie bei strict und non-strict unterschiedliche Leistungen sehen. Ein Beispiel: Beim nicht-strikten Modell wird ein Objekt nach einer Aktualisierung einfach aus dem Cache geholt... der Preis für das Holen wird beim nächsten Zugriff anstelle eines Post-Update-Event-Handlers gezahlt. Beim strikten Modell wird die erneute Zwischenspeicherung automatisch durchgeführt. Ähnlich verhält es sich mit Einfügungen, bei denen das strict-Modell nichts unternimmt und das neu eingefügte Objekt in den Cache lädt.

Bei Non-Strict besteht außerdem die Möglichkeit eines Dirty Read, da der Cache zum Zeitpunkt des Lesens nicht gesperrt ist und Sie das Ergebnis der Änderung des Elements durch einen anderen Thread nicht sehen würden. Bei der strikten Variante wird der Cache-Schlüssel für dieses Element gesperrt und Sie werden aufgehalten, sehen aber das absolut letzte Ergebnis.

Wenn also selbst in einer Umgebung mit nur einem Ziel eine große Anzahl gleichzeitiger Lese-/Bearbeitungsvorgänge an Objekten stattfindet, besteht die Möglichkeit, dass die Daten nicht ganz korrekt sind.

Dies wird natürlich zu einem Problem, wenn eine Speicherung durchgeführt wird und ein Bearbeitungsbildschirm geladen wird: Die Person, die glaubt, die neueste Version des Objekts zu bearbeiten, ist es in Wirklichkeit nicht, und sie erlebt eine böse Überraschung, wenn sie versucht, die Änderungen an den veralteten Daten zu speichern, die sie geladen hat.

2voto

Achow Punkte 8350

Ich habe einen Beitrag erstellt aquí um die Unterschiede zu erklären. Bitte schauen Sie es sich an und kommentieren Sie es.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X