并行部署的 web 应用程序的所有版本的缓存都已关闭

Caches of all versions of a webapp deployed in parallel are shutdowned

我在 Tomcat 实例上的版本为 deployed in parallel 的 Web 应用程序中使用 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。

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

1)如何停止缓存?

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

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

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

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

所以唯一对你有用的方法是确保你的缓存管理器最终在不同的 class 加载器中,也就是说 ehcache 是由网络应用程序加载的 class 加载器而不是容器一号。

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

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