2008-12-18 5 views
5

Ich habe 2 verschiedene Webapps (Paket in verschiedene Kriegsdateien), die einige Daten über einen Cache (ehcache) teilen müssen. Ich möchte diese Idee mit Ihnen testen, um zu sehen, ob es funktioniert.Zugriff auf denselben ehcache aus 2 verschiedenen Kriegsdateien

Meine Idee ist es, einen Dienst zu erstellen, der den ehcache bootstrappt/zugreift und in einem jar einpackt. Dann Paket, das Glas in den beiden Weltkriegen:

  • WAR1: ehcache-service.jar
  • WAR2: ehcache-service.jar

Würde der Arbeit in einer solchen Konfiguration ehcache?

+0

Könnten Sie mehr darüber herausfinden, was Sie mit dem gemeinsam genutzten Cache erreichen möchten? – lucas

+0

Ich möchte es als eine verteilte Sperre verwenden. Ich könnte eine Datenbank verwenden, um anzuzeigen, dass eine Transaktion läuft (aber ich glaube, das ist ein Anti-Pattern). Usecase: War1 startet ein TX, speichert es im Cache. Dies verhindert, dass der gleiche Sender gestartet wird. War2 macht TX basierend auf einem externen Ereignis ungültig. – ashitaka

Antwort

5

Sie müssen ein separates JAR mit allen Klassen (und deren Abhängigkeiten) erstellen, welche Instanzen Sie zwischenspeichern möchten und dann dieses jar sowie ehcache.jar als Bibliothek bereitstellen (abhängig davon, welchen Anwendungsserver Sie verwenden) Verwenden Sie das Verfahren möglicherweise anders), im Falle von Tomcat 6 bedeutet das Kopieren von Gläsern in den lib-Ordner.

Was passiert dann ist, dass ehcache und Ihre Domain-Klassen von der Classloader von allen Web-Anwendungen gemeinsam geladen werden, so dass Instanzen im Cache zwischengespeichert und im Speicher verfügbar sind.

Die Abhängigkeiten Ihrer Domänenklassen sind wichtig. Sie sollten daher sehen, ob dieser Ansatz in Ihrem Projekt durchführbar ist. Dies kann sich auch auf die Art auswirken, wie Sie die Webanwendungen neu starten.


Darüber hinaus sollten Sie beachten, dass Cache und Freigabe nicht die gleiche Sache sind. Cache ist eine Optimierung. Wenn Sie eine Objektinstanz in den Cache stellen, wird sie möglicherweise sofort gelöscht, wenn z. B. der Cache nicht genügend Speicherplatz oder eine Konfiguration für die Bereinigungsrichtlinie aufweist. Möglicherweise müssen Sie überprüfen, wie Sie Ecache im Allgemeinen verwenden möchten.

+0

Ich benutze Tomcat, damit Bibliotheken, die von allen Webapps geteilt werden, in CATALINA_HOME/common/lib gehen. Es gibt ein komplizierteres Problem, da ich den Cache auf mehrere Tomcat-Server in einem Cluster replizieren möchte. – ashitaka

+0

Ich mag Ihre Aussage "Cache ist eine Optimierung". Ich muss möglicherweise wieder auf die Verwendung der Datenbank zum Speichern des freigegebenen Status zurückgreifen, da ich die Isolationsstufe SERIALIZABLE verwenden kann, um konsistente Lese-/Schreibvorgänge sicherzustellen. – ashitaka

2

Das Problem Ihrer Konfiguration ist, dass jeder Krieg mit separaten ClassLoader geladen wird und es gibt zwei Instanzen Ihres ehcache-Service - jede Webanwendung hat ihre eigene Kopie des Dienstes. Sie können Ihren Caching-Service als Web-Service (zum Beispiel) implementieren und ihn aus war1 und war2 verwenden.