Frage

Wir haben eine Caching-Schicht auf unserer J2EE-Anwendung erstellt. In diesem Fall verwenden wir Ehcache. Dies hat einige Herausforderungen.

Lassen Sie uns dieses Beispiel.

OrderItem orderitem = cache.getOrderItemByID("id");
OrderItem old_orderitem = cache.getOrderItemID("id");

orderitem.setStatus(1);
old_orderitem.setStatus(2);

Wenn wir nicht vorsichtig sind, werden alle zu einem dieser Objekte vorgenommenen Änderungen auf die andere auswirken (sie verweisen auf das gleiche Objekt). Speicher OrderItem zurück zum dabase wäre es status = 2

haben machen

Wie würden wir lösen dies der beste Weg?

Wir haben versucht, eine .copyObject () -Methode für jedes Objekt zu machen. Was schafft nur ein neues Objekt und setzt alle Werte. Aber dies scheint nicht wie eine gute Lösung.

Das Beispiel war nur zu illustrieren. Der Code ist weitaus komplexer als das, aber das Ergebnis ist das gleiche.

**********************-Update 15.07.2010 ********************* *****************************

In EHCache 2 gibt es einige Optionen auf copyRead drehen () und Copywrite (). Und das löst alle meine Probleme:)

War es hilfreich?

Lösung

Dies ist ein Problem mit wandelbarem Zustand. Es ist nicht nur Caching, es ist jederzeit Sie wandelbar mehrere Verweise auf das gleiche Objekt und das Objekt haben könnte. Zum Beispiel:

HashMap map = new HashMap();
map.put("one", new OrderItem());
OrderItem one = map.get("one");
OrderItem two = map.get("one");
one.setStatus(1);
two.setStatus(2);

Wird genau das gleiche Problem. Dies wird noch komplizierter, wenn Sie eine Umgebung mit gemeinsamer Zugriff haben. Eine Möglichkeit, dies zu lösen, ist nur unveränderliche Objekte hat. Auf diese Weise, wenn Sie ein Objekt mit anderen Staat wollen, sind Sie gehen zu müssen, eine neue machen. Es macht auch die gleichzeitige Programmierung einfacher.

Sie haben Recht, das Objekt zu kopieren zu berücksichtigen. Ihre Optionen sind:

Jede hat ihre Stärken und Schwächen und die man funktioniert am besten auf Ihrer Umgebung ab.

Andere Tipps

Es klingt wie Sie die Daten, welche ein Objekt gecached werden sollen (beispielsweise die Ergebnisse einer Datenbankabfrage) eher als ein Objekt selbst (zum Beispiel Sitzungsdaten für einen Benutzer, die Sie möglicherweise an anderer Stelle abgerufen werden).

Wenn dies der Fall ist, wird der eigene Cacheing Schicht (etwa ehcache) muss ein Objekt aus dem Cache-Daten erstellen, wenn ein Benutzer eine Anforderung macht - dies wird Ihnen ein einzigartiges Objekt jedes Mal, und Sie werden nicht Objekt zu Interferenzen kommen .

Wenn Sie aus dem Cache von id (getOrderItemById) abrufen würde ich davon ausgehen, dass "das Objekt erhält eindeutig von id identifiziert =?" Bedeuten. In Ihrem zweiten Auszug Sie haben (oder versuchen zu haben?) 2 verschiedene Objekte, so dass es ein bisschen aussieht wie du ist versuchen, zwei widersprüchliche Dinge im Code zu tun.

Sie könnten Einzigartigkeit-Id = „ID“ erzwingen ist immer das gleiche Objekt. Wenn Sie den Status gesetzt und dann zurückgesetzt wird, bedeutet es das gleiche Objekt neuen Status hat. Sie würden wahrscheinlich wollen die .equals Methode erweitern true zurück, wenn die ID als auch übereinstimmt.

Sie können auch einen „schmutzigen“ Flag verwenden, um Objekte zu markieren, die von den (Transaktions?) Datenspeichern geändert wurden.

eine Kopie zu machen ist kein schlechter Weg, um mit diesem entweder zu behandeln, obwohl es nicht klar ist, was es bedeutet, zwei Objekte haben herumlaufen mit derselben ID. Vielleicht soll die Kopie mit einem Null-ID erstellt werden, um anzuzeigen, dass sie noch nicht im Cache vorhanden ist?

Was ist das richtige Verhalten für Ihre Anwendung?

Ehcache bieten Unterstützung für Schlüssel über eine explizite Sperre API sperren. Sie können mit Lese- und Schreibsperren im Cache auf dem Schlüssel verriegeln. Dies sperrt nicht auf dem Wert im Cache, so dass das Objekt noch offen zu Mutation, wenn der Programmierer so entscheidet.

Dies kann oder kann das Problem nicht lösen Sie erwähnen, je nachdem wie man es sehen. Wenn der Programmierer zu diszipliniert wiling und verwendet Objekte Lese erworben nur für Lesezwecke und ändert Cache + update, wenn Objekte mit Schreibsperre auf dem Schlüssel erworben, dann sollte diese Arbeit.

Allerdings ist das veränderbare Zustand Problem, wie jamie McCrindle erwähnt, geht nicht weg.

Referenz: http://ehcache.org/documentation/explicitlocking.html

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top