并行部署的 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
,它只会从包含的应用程序中关闭缓存管理器。
我在 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
,它只会从包含的应用程序中关闭缓存管理器。