2 Stimmen

Seltsames Problem mit dem Hibernate-Cache

Wir verwenden Hibernate 3.1 mit Spring MVC 2.0. Unser Problem tritt auf, wenn Daten direkt in der Datenbank aktualisiert werden (nicht in der Anwendung). Wir verwenden einen Filter, um eine Sammlung von Ergebnissen danach zu filtern, ob die Aufträge geöffnet oder geschlossen sind. Wenn wir eine Bestellung in der DB auf "geschlossen" ändern, gibt der Filter die richtige Liste zurück, aber der Status des Objekts ändert sich nicht.

  • Wir haben kein Second-Level- oder Query-Caching aktiviert.
  • Der Abruf der Sammlung aus der DB erfolgt über die Session.createQuery von Hibernate.
  • Außerdem haben wir eine SessionFactory verkabelt und verwenden eine Session in der gesamten Anwendung.

Das einzige Mal, dass das Objekt das korrekte Statusergebnis anzeigt, ist, wenn der Server neu gestartet wird - was wir lieber nicht regelmäßig tun möchten.

5voto

Brian Deterling Punkte 13329

Die Session hat immer einen "First-Level"-Cache, d.h. wenn Sie eine Session verwenden, wird alles, was Sie durch sie lesen, zwischengespeichert. Hibernate führt die Abfrage an die Datenbank aus, prüft dann aber beim Aufbau der Objekte den Session-Cache, um den Aufbau eines neuen Objekts zu vermeiden, so dass alle in der Datenbank geänderten Spalten nicht aktualisiert werden. Wenn Sie die Session schließen und eine neue Session holen, wird bei der nächsten Abfrage das gesamte Objekt aus der Datenbank gelesen.

1voto

Steve Moyer Punkte 5573

Sie können nicht wirklich erwarten, dass Hibernate den "schmutzigen" Zustand seiner zwischengespeicherten Objekte richtig verwaltet, wenn Sie Prozesse haben, die "hinter seinem Rücken" ablaufen. Wenn Sie Annotationen verwenden, würde ich vorschlagen, den Status (wenn das der Name des Feldes ist) als @Transient zu markieren, so dass Hibernate weiß, dass es diesen Wert jedes Mal aus der Datenbank holen muss.

1voto

Darren Greaves Punkte 3286

Wahrscheinlich sollten Sie die Zwischenspeicherung aktivieren und eine Verfallszeit festlegen. Dann wird Hibernate die Daten aus der Datenbank aktualisieren, sobald der Cache abgelaufen ist und jemand sie angefordert hat.

Ich verwende dies bei einem Heimprojekt, bei dem ich gelegentlich die Datenbank ändere. Ich warte dann eine Weile, aktualisiere die Seite und sehe meine geänderten Daten.

Schauen Sie sich ehcache in Hibernate an.

1voto

extraneon Punkte 22810

Sie können die Versionierung verwenden Hibernate Version . Ihr externer Prozess muss die Versionsnummer (oder den Zeitstempel) erhöhen, damit Hibernate weiß, dass eine neue Version verfügbar ist.

Dies ist nicht notwendigerweise eine sofortige Änderung, sondern geschieht häufiger als ein Neustart des Containers (in unserem Fall alle paar Minuten).

Sie hat einige Nachteile:

  • Ihre Anwendung kann eine Zeit lang mit alten Daten funktionieren
  • Wenn die Version durch einen Batch-Job erhöht wurde und Hibernate versucht, einen aktualisierten Datensatz einer älteren Version zu speichern, wird eine Ausnahme erzeugt
  • Eine gemeinsam genutzte Datenbank ist weniger gut skalierbar; häufige Überprüfungen kosten Leistung.

Ich bin keineswegs ein Hibernate-Experte, aber es ist möglich.

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