目前我正在为我的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;
}
}
答案 0 :(得分:0)
没有开箱即用支持你做的事。
Ehcache 2.x支持refresh ahead,可以使用scheduled refresh ahead进一步调整。这不完全是你所要求的,但可能足够接近。
**编辑问题后的补充**
您的编辑建议您要保留过时的值,因为数据库不再具有该键的条目,而不是告诉用户没有值。这里再次没有支持,因为它违背了缓存的原则。