如何配置 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。这与您的要求不完全相同,但可能足够接近。
** 问题编辑后的补充**
你的编辑表明你想保留一个过时的值,因为数据库不再有该键的条目,而不是告诉用户没有值。这里再次不支持它,因为它违反了缓存的原则。
目前我正在为我的网络应用程序使用 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。这与您的要求不完全相同,但可能足够接近。
** 问题编辑后的补充**
你的编辑表明你想保留一个过时的值,因为数据库不再有该键的条目,而不是告诉用户没有值。这里再次不支持它,因为它违反了缓存的原则。