我在一个在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。
答案 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,所有缓存都将被清除。