并行部署的所有Webapp版本的缓存都将被关闭

时间:2015-06-19 13:03:13

标签: java tomcat ehcache

我在一个在Tomcat实例上版本为deployed in parallel的webapp中使用ehcache。这是在不停止应用程序的情况下部署新版本的便捷方式。

但是我有这样的方法有问题:即使我给缓存和磁盘存储不同的名称,取决于webapp的版本,所有缓存停止时停止一个实例。

我的配置是:

<?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}

在构建过程中被maven替换。

有人知道如何避免这种不受欢迎的行为吗?

我使用的是ehcache-core-2.4.3和hibernate-ehcache-4.3.8。

2 个答案:

答案 0 :(得分:2)

net.sf.ehcache.constructs.web.ShutdownListener的工作方式是关闭所有缓存管理器。

因此,为您工作的唯一方法是确保缓存管理器最终位于不同的类加载器中,即ehcache由Web应用程序类加载器加载而不是容器加载。

您是否在应用WEB-INF/lib中提供了ehcache jar?如果是,你确定tomcat的类路径中没有Ehcache吗?

如果此解决方案仍然不起作用,您可能最好创建自己的ServletContextListener,它只会从包含的应用程序关闭缓存管理器。

答案 1 :(得分:0)

您的查询中缺少一些详细信息。

1)你是如何停止缓存的?

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

3)您是否检查过创建缓存对象的位置?

但是作为一种行为,一旦重新启动tomcat,所有缓存都将被清除。