2015-06-19 61 views
8

我在一個Tomcat實例上的版本爲deployed in parallel的web應用中使用ehcache。這是在不停止應用程序的情況下部署新版本的一種便捷方式。並行部署的web應用的所有版本的緩存都關閉

然而,我有這個辦法進行了一個問題:即使我給高速緩存和磁盤儲存不同的名稱,這取決於Web應用程序的版本,停止一個實例時所有高速緩存停止。

我的配置是:

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

在生成過程中被替換的行家。

有人知道如何避免這種不需​​要的行爲嗎?

我正在使用ehcache-core-2.4.3和hibernate-ehcache-4.3.8。

+0

也許我猜錯了,但不應該將'diskPersistence'設置爲true。我不知道EhCache的內部結構,但是如果緩存僅保存在內存中,並且關閉了一個實例(在同一個JVM中,因爲它仍然是一個tomcat實例),緩存清除聽起來是正確的。 – meistermeier

+0

糾正我,如果我錯了,但DOC狀態: diskPersistent:«對於高速緩存溢出到磁盤,磁盤緩存是否CacheManager的實例之間仍然存在» 假是我想要的行爲。 –

+0

我不知道在哪裏可以找到完整的文檔爲ecache 2.4,但我從 – meistermeier

回答

2

方式net.sf.ehcache.constructs.web.ShutdownListener作品是關閉全部緩存管理器。

因此,爲您工作的唯一方法是確保您的緩存管理器最終位於不同的類加載器中,即ehcache由Web應用程序類加載器加載,而不是容器加載器。

你在你的應用程序的WEB-INF/lib中提供了ehcache jar嗎?如果是的話,你確定在tomcat的classpath中沒有Ehcache嗎?

如果這個解決方案仍然無法正常工作,你可能會更好創建自己ServletContextListener那會從包含應用程序關閉僅高速緩存管理器。

+0

我在tomcat/lib中提供了ehcache。你的解釋很有趣。我將在星期一進行測試。當休眠停止它的ehcache實例時,我可能只是安全地關閉休眠,而沒有其他任何事情。 –

+0

你說得對,我很樂意給你50個聲望點。 :-) –

0

您的查詢中缺少一些詳細信息。

1)你如何停止緩存?

2)你如何在tomcat中部署應用程序?

3)您是否檢查過創建緩存對象的位置?

但作爲一種行爲,一旦你重新啓動tomcat,所有的緩存將被清除。

+0

1)高速緩存http://ehcache.org/documentation/2.8/configuration/fast-restart /節「與以前版本的兼容性」我的信息由net.sf.ehcache.constructs.web.ShutdownListener偵聽器停止。 2)通過在webapps/dir中放棄戰爭來部署應用程序。然後,由於Tomcat配置而自動部署。 3)也許我不完全理解你的問題,但是每個版本都使用單獨的磁盤存儲,並且在那裏寫東西。我應該看看別的嗎? –