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

How to configure ehcache to replace expired object only upon successfully retrieving a newer version of the object

目前我正在为我的网络应用程序使用 Spring 网络框架。我已经实现了一个基本的 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) 中查找对象来确保刷新缓存,并且只有在成功检索时才会删除旧版本的元素?

编辑:刷新提前策略的缓存加载器。

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;
}

}

没有开箱即用的支持来满足您的要求。

Ehcache 2.x 支持 refresh ahead which can be further tweaked with scheduled refresh ahead。这与您的要求不完全相同,但可能足够接近。

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

你的编辑表明你想保留一个过时的值,因为数据库不再有该键的条目,而不是告诉用户没有值。这里再次不支持它,因为它违反了缓存的原则。