如何在成功检索对象的较新版本时配置ehcache以替换过期对象

时间:2017-12-20 10:50:07

标签: java caching ehcache

目前我正在为我的Web App使用Spring Web框架。我已经实现了一个基本的CacheConfig.java文件,该文件读取ehcache.xml并创建一个CacheManager,用于从缓存中获取元素或向缓存添加元素。我的ehcache.cml如下:

    <cache name="Cache"
       maxEntriesLocalHeap="100"
       maxEntriesLocalDisk="0"
       eternal="false"
       diskSpoolBufferSizeMB="0"
       timeToIdleSeconds="43200"
       timeToLiveSeconds="43200"
       memoryStoreEvictionPolicy="LFU"
       >
    <persistence strategy="none"/>   

如何通过首先从后端数据库(SOR)查找对象来确保刷新缓存,并且只有在成功检索时才会删除旧版本的元素?

编辑:用于refreshahead策略的CacheLoader。

public class TestCacheLoader implements CacheLoader {
@Override
public Object load(Object key) throws CacheException {
    //return null;
    return load(key,null);


}

@Override
public Map loadAll(Collection keys) {
    //return null;
    return loadAll(keys,null);
}

@Override
public Object load(Object key, Object argument) {
    Object obj = null;
    try {
       obj = ReadFromDatabase(key);
    } catch (DatabaseValueNotFoundException e) {
      **How can I return the old value here?**
    }
    return obj;
}

@Override
public Map loadAll(Collection keys, Object argument) {
    //return null;
    Map newValues = new HashMap<Object,Object>();
    for(Object key : keys){
        Object value = load(key,null);
        if(value != null){
            newValues.put(key,value);
        }
    }
    return newValues;
}

@Override
public String getName() {
    return null;
}

@Override
public CacheLoader clone(Ehcache ehcache) throws CloneNotSupportedException {
    return null;
}

@Override
public void init() {

}

@Override
public void dispose() throws CacheException {

}

@Override
public Status getStatus() {
    return null;
}

}

1 个答案:

答案 0 :(得分:0)

没有开箱即用支持你做的事。

Ehcache 2.x支持refresh ahead,可以使用scheduled refresh ahead进一步调整。这不完全是你所要求的,但可能足够接近。

**编辑问题后的补充**

您的编辑建议您要保留过时的值,因为数据库不再具有该键的条目,而不是告诉用户没有值。这里再次没有支持,因为它违背了缓存的原则。