2015-06-19 5 views
8

Ich verwende ehcache in einer Webapp, deren Versionen deployed in parallel auf einer Tomcat-Instanz sind. Dies ist eine praktische Möglichkeit, neue Versionen bereitzustellen, ohne eine Anwendung zu stoppen.Zwischengespeicherte Caches aller Versionen einer Webanwendung werden geschlossen

Ich habe aber ein Problem mit dieser Art und Weise zu verfahren: auch wenn ich die Cache und Disk-Speicher verschiedenen Namen geben, abhängig von den Versionen der Webapp, alle Caches gestoppt werden, wenn eine Instanz zu stoppen.

Meine config:

<?xml version="1.0" encoding="UTF-8"?> 
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:noNamespaceSchemaLocation="ehcache.xsd" name="mywebapp-${project.version}_build_${buildNumber}"> 
<defaultCache 
    maxElementsInMemory="1000" 
    maxElementsOnDisk="10000" 
    eternal="false" 
    timeToLiveSeconds="300" 
    timeToIdleSeconds="300" 
    overflowToDisk="true" 
    diskPersistent="false" 
    memoryStoreEvictionPolicy="LRU" 
    statistics="true" 
/> 

<cache 
    maxElementsInMemory="1000" 
    maxElementsOnDisk="10000" 
    name="org.hibernate.cache.internal.StandardQueryCache" 
    eternal="false" 
    timeToLiveSeconds="300" 
    timeToIdleSeconds="300" 
    overflowToDisk="true" 
    diskPersistent="false" 
    statistics="true"/> 

<cache 
    name="org.hibernate.cache.spi.UpdateTimestampsCache" 
    maxElementsInMemory="10000" 
    maxElementsOnDisk="100000" 
    timeToLiveSeconds="300" 
    timeToIdleSeconds="300" 
    eternal="false" 
    overflowToDisk="true" 
    diskPersistent="false" 
    statistics="true"/> 

<cache 
    name="query.Presences" 
    maxElementsInMemory="100" 
    maxElementsOnDisk="1000" 
    eternal="false" 
    timeToLiveSeconds="300" 
    timeToIdleSeconds="300" 
    overflowToDisk="true" 
    diskPersistent="false" 
    statistics="true"/> 

<diskStore path="java.io.tmpdir/mywebapp-${project.version}_build_${buildNumber}"/> 

</ehcache> 

${project.version} und ${buildNumber}

von Maven während des Erstellungsprozesses ersetzt.

Weiß jemand, wie man dieses unerwünschte Verhalten vermeidet?

Ich verwende ehcache-core-2.4.3 und Hibernate-ehcache-4.3.8.

+0

Vielleicht bin ich falsch im Raten, aber sollte nicht 'diskPersistence' auf wahr gesetzt werden. Ich kenne die Interna von EhCache nicht, aber wenn die Caches nur im Speicher gehalten werden und Sie eine Instanz herunterfahren (in der gleichen JVM, weil es immer noch eine Tomcat-Instanz ist), klingt es richtig, dass der Cache gelöscht ist. Korrigieren Sie mich – meistermeier

+0

, wenn ich falsch bin, aber die doc heißt es: diskPersistent: «Für Caches, dass Überlauf auf die Festplatte, ob die Festplatten-Cache weiterhin besteht zwischen Cachemanager-Instanzen» falsch ist das Verhalten, das ich wünsche. –

+0

Ich weiß nicht, wo man vollständige Dokumente für Ecache 2.4 finden kann, aber ich habe meine Informationen von http://ehcache.org/documentation/2.8/configuration/fast-restart/Abschnitt "Kompatibilität mit früheren Versionen" – meistermeier

Antwort

2

Der Weg, net.sf.ehcache.constructs.web.ShutdownListener funktioniert, ist durch Herunterfahren ALLE Cache-Manager.

Die einzige Möglichkeit, dies für Sie zu arbeiten, besteht darin, sicherzustellen, dass Ihre Cache-Manager in verschiedenen Klassenladern landen, dh dass ehcache vom Klassenladeprogramm für Webanwendungen und nicht vom Container geladen wird.

Stellen Sie ehcache jar in Ihrer App WEB-INF/lib? Wenn ja, sind Sie sicher, dass es keinen Ehcache im Klassenpfad von Tomcat gibt?

Wenn diese Lösung immer noch nicht funktioniert, können Sie besser Ihre eigene ServletContextListener erstellen, die nur den Cache-Manager von der enthaltenden Anwendung herunterfahren würde.

+0

Ich stelle ehcache in tomcat/lib zur Verfügung. Deine Erklärung ist interessant. Ich werde am Montag testen. Wenn Hibernate seine ehcache-Instanz stoppt, kann ich den Hibernate-Modus beenden und sonst nichts. –

+0

Du hattest recht, ich gebe dir gerne die 50 Rufpunkte. :-) –

0

Einige Details fehlen in Ihrer Anfrage.

1) Wie stoppen Sie den Cache?

2) Wie implementieren Sie die Anwendung in Tomcat?

3) Haben Sie den Speicherort des Cache-Objekts überprüft?

Aber als Verhalten wird alle Cache gelöscht, sobald Sie Tomcat neu starten.

+0

1) Der Cache wird vom net.sf.ehcache.constructs.web.ShutdownListener-Listener gestoppt. 2) Die Anwendung wird bereitgestellt, indem der Krieg in der webapps/dir verworfen wird.Dann wird es aufgrund der Tomcat-Konfiguration automatisch bereitgestellt. 3) Vielleicht verstehe ich Ihre Frage nicht vollständig, aber jede Version verwendet ihren separaten Disk-Speicher, und die Dinge werden dort geschrieben. Soll ich etwas anderes suchen? –