如何在spring mvc中使用ehcache进行永久缓存

时间:2014-11-04 21:26:34

标签: java spring-mvc caching ehcache

我想在我的spring mvc web应用程序中使用ehcache。因为我的服务器每天都重置,所以我希望缓存是永久性的。我将它保存在硬路径中吗?和锄头保存吗? 感谢。

在我的dispatcher-servlet.xml中我添加了这个

 <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager">
   <property name="cacheManager" ref="ehcache"/>
 </bean>
 <bean id="ehcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
  <property name="configLocation" value="classpath:ehcache.xml"/>
  <property name="shared" value="true"/>
</bean>

我的ehcach.xml是

  <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd">
<diskStore path="c:/tmp"/>

<defaultCache
        maxElementsInMemory="500" eternal="true" overflowToDisk="false" memoryStoreEvictionPolicy="LFU"/>
      <cache name="mycache"
       maxElementsInMemory="0"
       eternal="true"
       timeToIdleSeconds="120"
       timeToLiveSeconds="120"
       overflowToDisk="true"
       maxElementsOnDisk="10000000"
       diskPersistent="true"
       diskExpiryThreadIntervalSeconds="1200"
       memoryStoreEvictionPolicy="LRU">
      [1] <persistence strategy="localRestartable" synchronousWrites="false" /> 
      </cache>

我添加这个[1],直到缓存是永久性的,并且在服务器重置后不能删除。但是发生此异常时Element不允许嵌套元素。 我也使用ehcach-core2.7.0.jar

    Element <cache> does not allow nested <persistence> elements.

2 个答案:

答案 0 :(得分:3)

您不应将diskPersistent元素上的旧版配置选项 - 属性overflowToDiskcache与推荐的persistence元素混合使用。

但是,要获得开源磁盘持久性设置,您需要坚持使用旧版选项。

因此,您的配置应将persistence元素删除为:

<cache name="mycache"
     maxElementsInMemory="0"
     eternal="true"
     timeToIdleSeconds="120"
     timeToLiveSeconds="120"
     overflowToDisk="true"
     maxElementsOnDisk="10000000"
     diskPersistent="true"
     diskExpiryThreadIntervalSeconds="1200"
     memoryStoreEvictionPolicy="LRU">
</cache>

但是,您还应该为maxElementsInMemory提供一个有意义的值,这样您就可以拥有一组热门条目,在访问它们时无需支付反序列化价格。

您还需要决定是否需要永久元素或过期。为此,请移除eternal="true"timeToLiveSecondstimeToIdleSeconds对。出于兼容性原因,两者都不是Ehcache中的错误,但是很难知道您最初的意图。

作为最后的建议,我会将缓存内容移动到名称更具描述性的文件夹,而不是c:/tmp

请注意,开源磁盘持久层不具有容错能力,因此在执行IO时,CacheCacheManager或异常的不正确关闭可能会破坏数据。如果发生这种情况,您必须先清除数据文件夹,然后才能重新启动缓存。

有关详细信息,请参阅the Ehcache 2.7 persistence documentation

答案 1 :(得分:0)

你试过这个吗?

<cache eternal="true"
  maxElementsInMemory="0"
  name="<cache name>"
  overflowToDisk="true"/>