缓存条目过期后未调用 EhCache CacheLoaderWriter.load()
EhCache CacheLoaderWriter.load() not called after cache entry expired
我已经使用 CacheLoaderWriter 创建了简单的 EhCache 测试:
Cache<Long, BigInteger> cache = cacheManager.getCache("aCache3", Long.class, BigInteger.class);
assertEquals(cache.get(2L), BigInteger.ONE);
Thread.sleep(6000);
assertEquals(cache.get(2L), BigInteger.ONE); // fails here with null!=1
当key为2L的缓存项在休眠后过期时,cache.get(2L)returns为空值。在我看来,它应该首先调用 CacheLoaderWriter.load() 方法从 SoR 中获取正确的值,然后 return 它。
您能否解释一下为什么会发生这种情况以及我该如何改变这种行为?是否有任何其他配置选项或者我是否遗漏了什么?
ehcache.xml:
<cache alias="aCache3" uses-template="default">
<key-type>java.lang.Long</key-type>
<value-type>java.math.BigInteger</value-type>
<expiry><ttl unit="seconds">4</ttl></expiry>
<loader-writer >
<class >com.example.jeight.ehcache.MapCacheLoaderWriter</class>
</loader-writer>
<resources>
<heap unit="entries">10</heap>
<disk persistent="false" unit="MB">10</disk>
</resources>
MapCacheLoaderWriter:
public class MapCacheLoaderWriter implements CacheLoaderWriter<Long, BigInteger> {
private Logger LOGGER = LoggerFactory.getLogger(getClass());
private Map<Long, BigInteger> map;
public MapCacheLoaderWriter() {
map = new HashMap<>();
}
@Override
public void delete(Long k) throws Exception { }
@Override
public void deleteAll(Iterable<? extends Long> ks) throws BulkCacheWritingException, Exception { }
@Override
public BigInteger load(Long k) throws Exception {
LOGGER.info("Cache load: " + k);
if (!map.containsKey(k)) {
BigInteger v = fib(k);
map.put(k, v);
}
return map.get(k);
}
@Override
public Map<Long, BigInteger> loadAll(Iterable<? extends Long> ks) throws BulkCacheLoadingException, Exception {
Map<Long, BigInteger> result = new HashMap<>();
for (Long k : ks) {
load(k);
}
return result;
}
@Override
public void write(Long k, BigInteger v) throws Exception {
LOGGER.info("Cache write: " + k + " " + v);
map.put(k, v);
}
@Override
public void writeAll(Iterable<? extends Entry<? extends Long, ? extends BigInteger>> kvMap)
throws BulkCacheWritingException, Exception {
for (Entry<? extends Long, ? extends BigInteger> k : kvMap) {
write(k.getKey(), k.getValue());
}
}
private BigInteger fib(long k) {
// some code returning a non-null value
}
}
这是一个需要修复的错误 - filed it 在 Ehcache 中。
感谢举报!
你唯一可以做的就是将你的缓存限制在一个单一的层上——如果你可以接受较小的条目集或者磁盘如果你可以接受每个添加的反序列化get
.
我已经使用 CacheLoaderWriter 创建了简单的 EhCache 测试:
Cache<Long, BigInteger> cache = cacheManager.getCache("aCache3", Long.class, BigInteger.class);
assertEquals(cache.get(2L), BigInteger.ONE);
Thread.sleep(6000);
assertEquals(cache.get(2L), BigInteger.ONE); // fails here with null!=1
当key为2L的缓存项在休眠后过期时,cache.get(2L)returns为空值。在我看来,它应该首先调用 CacheLoaderWriter.load() 方法从 SoR 中获取正确的值,然后 return 它。
您能否解释一下为什么会发生这种情况以及我该如何改变这种行为?是否有任何其他配置选项或者我是否遗漏了什么?
ehcache.xml:
<cache alias="aCache3" uses-template="default">
<key-type>java.lang.Long</key-type>
<value-type>java.math.BigInteger</value-type>
<expiry><ttl unit="seconds">4</ttl></expiry>
<loader-writer >
<class >com.example.jeight.ehcache.MapCacheLoaderWriter</class>
</loader-writer>
<resources>
<heap unit="entries">10</heap>
<disk persistent="false" unit="MB">10</disk>
</resources>
MapCacheLoaderWriter:
public class MapCacheLoaderWriter implements CacheLoaderWriter<Long, BigInteger> {
private Logger LOGGER = LoggerFactory.getLogger(getClass());
private Map<Long, BigInteger> map;
public MapCacheLoaderWriter() {
map = new HashMap<>();
}
@Override
public void delete(Long k) throws Exception { }
@Override
public void deleteAll(Iterable<? extends Long> ks) throws BulkCacheWritingException, Exception { }
@Override
public BigInteger load(Long k) throws Exception {
LOGGER.info("Cache load: " + k);
if (!map.containsKey(k)) {
BigInteger v = fib(k);
map.put(k, v);
}
return map.get(k);
}
@Override
public Map<Long, BigInteger> loadAll(Iterable<? extends Long> ks) throws BulkCacheLoadingException, Exception {
Map<Long, BigInteger> result = new HashMap<>();
for (Long k : ks) {
load(k);
}
return result;
}
@Override
public void write(Long k, BigInteger v) throws Exception {
LOGGER.info("Cache write: " + k + " " + v);
map.put(k, v);
}
@Override
public void writeAll(Iterable<? extends Entry<? extends Long, ? extends BigInteger>> kvMap)
throws BulkCacheWritingException, Exception {
for (Entry<? extends Long, ? extends BigInteger> k : kvMap) {
write(k.getKey(), k.getValue());
}
}
private BigInteger fib(long k) {
// some code returning a non-null value
}
}
这是一个需要修复的错误 - filed it 在 Ehcache 中。
感谢举报!
你唯一可以做的就是将你的缓存限制在一个单一的层上——如果你可以接受较小的条目集或者磁盘如果你可以接受每个添加的反序列化get
.