4

我正在使用ehcache。我正在缓存 Spring @Service 方法:

@Service( value = "dataServicesManager" )
@Transactional
public class DataServicesManager implements IDataServicesManager{

    @Autowired
    private IDataDAO dataDAO;



    @Override
    @Cacheable( value = "alldatas" )
    public List<Data> getAllDatas(Integer param) {

                // my logic

        return results;

    }
// others services
}

这是 Spring 配置片段:

 <cache:annotation-driven/>

<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="WEB-INF/ehcache.xml"/>
    <property name="shared" value="true"/>
</bean>

这是我的 ehcache 配置。

<ehcache xsi:noNamespaceSchemaLocation="ehcache.xsd" updateCheck="true" monitoring="autodetect" dynamicConfig="true">

<diskStore path="C:/TEMP/ehcache"/>

<defaultCache   eternal="false"
       timeToIdleSeconds="300"
       timeToLiveSeconds="1200"
       overflowToDisk="true"
       diskPersistent="false"
       diskExpiryThreadIntervalSeconds="120" />

<cache name="alldatas" maxEntriesLocalHeap="10000" eternal="false"
        timeToIdleSeconds="21600" timeToLiveSeconds="21600" memoryStoreEvictionPolicy="LRU">

    </cache>

</ehcache>

当我从 Spring @Controller 调用服务方法 getAllDatas 时,该方法被缓存,第二次调用检索结果存储在缓存中。<diskStore path="C:/TEMP/ehcache"/>我不明白的是我在 ehcache.xml 中找不到指定。所以我有两个问题:

问题一:为什么没有创建“C:/TEMP/ehcache”目录?

问题2:我的服务结果缓存在哪里?

4

2 回答 2

2

你的 Ehcache 配置是罪魁祸首。

defaultCache只有当您以编程方式创建缓存而不指定配置时,才会使用该元素。

但是你明确定义了你的alldatas缓存,没有任何磁盘选项。

所以你的配置需要变成:

<cache name="alldatas" maxEntriesLocalHeap="10000" eternal="false"
    timeToIdleSeconds="21600" timeToLiveSeconds="21600" memoryStoreEvictionPolicy="LRU"
    overflowToDisk="true"
    diskPersistent="false"
    diskExpiryThreadIntervalSeconds="120">

</cache> 

然后这个缓存将使用磁盘存储。

如果您不打算在应用程序中使用其他缓存,您也可以删除该defaultCache元素以清楚起见。

于 2014-11-07T08:41:54.143 回答
0

可能是因为您检索到的数据没有溢出到磁盘。缓存在内存中完成,直到超过某个阈值。尝试将 maxEntriesLocalHeap 减少到您知道的足够小以使您的数据溢出并查看文件是否已创建的值。

于 2014-11-06T12:21:56.217 回答