2015-06-19 25 views
8

Io uso ehcache in una webapp le cui versioni sono deployed in parallel su un'istanza di Tomcat. Questo è un modo pratico per distribuire nuove versioni senza arrestare un'applicazione.Le cache di tutte le versioni di un'applicazione Web distribuita in parallelo vengono arrestate

Io però ho un problema con questo modo di procedere: anche se io do la cache e memorizzare su disco nomi diversi, a seconda delle versioni della webapp, tutti cache sono fermato quando si arresta uno esempio.

La mia configurazione è:

<?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} e ${buildNumber}

essere sostituito dal Maven durante il processo di compilazione.

Qualcuno sa come evitare questo comportamento indesiderato?

Sto utilizzando ehcache-core-2.4.3 e hibernate-ehcache-4.3.8.

+0

Forse ho sbagliato a indovinare, ma non dovrebbe essere impostato su "diskPersistence" su true. Non conosco i componenti interni di EhCache, ma se le cache sono conservate solo in memoria e si chiude un'istanza (nella stessa JVM perché è ancora un'istanza di tomcat), sembra giusto che la cache sia deselezionata. Mi – meistermeier

+0

Correggetemi se sbaglio, ma gli stati doc: diskPersistent: «Per le cache che di overflow su disco, se la cache del disco persiste tra le istanze CacheManager» falso è il comportamento che desidero. –

+0

Non so dove trovare documenti completi per ecache 2.4 ma ho ricevuto le mie informazioni da http://ehcache.org/documentation/2.8/configuration/fast-restart/section "Compatibilità con versioni precedenti" – meistermeier

risposta

2

Il modo in cui lo net.sf.ehcache.constructs.web.ShutdownListener funziona chiudendo TUTTI i gestori di cache.

Quindi, l'unico modo per farlo funzionare è assicurarsi che i gestori della cache finiscano in caricatori di classi diversi, ovvero che ehcache sia caricata dal caricatore di classe dell'applicazione Web e non da quello del contenitore.

Fornisci un contenitore di ehcache nell'app WEB-INF/lib? Se sì, sei sicuro che non ci sia un Ehcache nel classpath di tomcat?

Se questa soluzione continua a non funzionare, è preferibile creare il proprio ServletContextListener che arresterebbe solo il gestore cache dall'applicazione contenente.

+0

Fornisco ehcache in tomcat/lib. La tua spiegazione è interessante. Proverò lunedì. Mentre ibernato interrompe la sua istanza di ehcache, potrei terminare in modo sicuro spegnendo l'ibernazione e nient'altro. –

+0

Avevi ragione, ti offro volentieri i 50 punti reputazione. :-) –

0

Alcuni dettagli non sono presenti nella query.

1) Come si ferma la cache?

2) Come si distribuisce l'applicazione in tomcat?

3) Hai controllato la posizione in cui viene creato l'oggetto cache?

Ma come comportamento, tutta la cache verrà cancellata una volta riavviato tomcat.

+0

1) La cache viene fermato dal listener net.sf.ehcache.constructs.web.ShutdownListener. 2) L'applicazione viene distribuita lasciando cadere la guerra in webapps/dir.Quindi, viene distribuito automaticamente a causa della configurazione di Tomcat. 3) Forse non capisco completamente la tua domanda, ma ogni versione usa il suo separato archivio, e le cose sono scritte lì. Dovrei cercare qualcos'altro? –