Hiberante 3.5.3-Final
EHcache 1.5.0
Hallo zusammen,
ich werde aus EHcache nicht schlau und hoffe, es kann mir jemand die folgenden Resultate erklaeren...
Ich habe eine n-zu-1-Beziehung zwischen A und B.
A und B sind beide mit
Code:
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
annotiert.
Fuer jeden Schritt unten wird eine neue Session verwendet.
Schritt 1: Ich lade mit Session::load(Class, Serializable) die Instanz a1; a1 zeigt auf b1
Hibernate druckt die zwei SQL-Ausdruecke um a1 und b1 (lazy) zu laden auf die Console
a1.toString() liefert Ausgabe auf Console von a1 und b1; Werte stimmen mit DB ueberein
Ich unterbreche die Ausfuehrung mit einem breakpoint und aendere ein Attribut von b1 direkt auf der DB.
Schritt 2: Ich lade mit Session::load(Class, Serializable) die Instanz b1.
Es wird kein SQL auf der Console ausgegeben
b1.toString() schreibt Attributwerte wie in Schritt 1 auf die Console; erwartet da b1 gecached wurde
Schritt 3: Ich lade mit Session::load(Class, Serializable) die Instanz a2; a2 zeigt ebenfalls auf b1
Hibernate druckt einen SQL-Ausdruck um a1 zu laden auf die Console
Kein SQL fuer das Lazy nachladen von b1
a1.toString() liefert Ausgabe auf Console von a2 und b1; Werte in b1 stimmen mit DB ueberein --> b1 wurde neu aus DB geladen
Ich unterbreche die Ausfuehrung mit einem breakpoint und aendere das Attribut von b1 direkt auf der DB erneut.
Schritt 4: Ich lade mit Session::load(Class, Serializable) die Instanz b1.
Es wird kein SQL auf der Console ausgegeben
b1.toString() schreibt gecachte Attributwerte fuer b1 wie aus Schritt 1 auf die Console!?!
Schritt 5: Ich lade mit Session::load(Class, Serializable) die Instanz a1
Es wird kein SQL auf der Console ausgegeben
a1.toString() schreibt gecachte Attributwerte fuer b1 wie aus Schritt 1 auf die Console!?!
Ich verstehe nicht, warum Schritt 3 aktuelle DB-Werte in b1 hat? b1 muesste doch im Cache gefunden werden?
Wenn in Schritt 3 die Instanz b1 neu aus der DB gelesen wurde, warum sehen dann Schritte 4 und 5 die alte Version von b1 aus Schritt 1. In anderen Worten, warum hat Schritt 3 nicht zu einem Update des Cacheeintrages gefuehrt?
Falls es hilft kann ich gern meinen Testcode posten.
Mein Problem: Instanzen von B werden durch einen externen Prozess staendig veraendert. In der Hibernate-Applikation brauche ich fuer alle Instanzen a*, die auf eine Instanz b zeigen, konsistente Werte in b. Die Werte in b duerfen dafuer mehrere Minuten alt sein.
Instanzen von A sind sehr teuer zu laden und muessen gecached werden.
Kann mir jemand aushelfen?
Nachtrag: Wenn CacheConcurrencyStrategy.READ_ONLY verwendet wird, dann fuehrt Schritt 3 zu einem Update des Caches und Schritte 4 und 5 sehen die selben Werte fuer b1 wie Schritt 3.