我开始认为我要求的是Ehcache是不可能的(至少是我的版本)
这是net.sf.ehcache.Cache.class源代码中的池配置:
// on-heap pool configuration
Pool onHeapPool;
if (configuration.getMaxBytesLocalHeap() > 0) {
PoolEvictor evictor = new FromLargestCachePoolEvictor();
SizeOfEngine sizeOfEngine = cacheManager.createSizeOfEngine(this);
onHeapPool = new BoundedPool(configuration.getMaxBytesLocalHeap(), evictor, sizeOfEngine);
} else if (getCacheManager() != null && getCacheManager().getConfiguration().isMaxBytesLocalHeapSet()) {
onHeapPool = getCacheManager().getOnHeapPool();
} else {
onHeapPool = new UnboundedPool();
}
稍后将使用net.sf.ehcache.store.MemoryStore.MemoryStore(Ehcache,Pool,BackingFactory,SearchManager)从此池创建net.sf.ehcache.store.MemoryStore.以下行创建net.sf.ehcache.pool.PoolAccessor:
if (pool instanceof UnboundedPool) {
this.poolAccessor = pool.createPoolAccessor(null, null);
} else {
this.poolAccessor = pool.createPoolAccessor(new Participant(),
SizeOfPolicyConfiguration.resolveMaxDepth(cache),
SizeOfPolicyConfiguration.resolveBehavior(cache).equals(SizeOfPolicyConfiguration.MaxDepthExceededBehavior.ABORT));
}
由于池是UnboundedPool(未指定堆大小),因此创建的PoolAccessor没有net.sf.ehcache.pool.SizeOfEngine,但更重要的是类型为net.sf.ehcache.pool.impl.UnboundedPool.UnboundedPoolAccessor.此类型的add方法不跟踪大小,而为有界池创建的PoolAccessor类型也是如此. (参见net.sf.ehcache.pool.impl.AbstractPoolAccessor.add(Object,Object,Object,boolean)).
所以,对于Ehcache有一个我可以使用的设置而言,我运气不好,但是,如果像我一样,你正在寻求一个无限的缓存,那么实现这个解决方案有一种愚蠢的方法.下面将跟踪添加的内存统计信息,但会允许对缓存进行无限制的添加:
timeToIdleSeconds="1800"
memoryStoreEvictionPolicy="LRU"
overflowToDisk="false"
overflowToOffHeap="false"
maxBytesLocalHeap="1">