我正在创建一个像这样的EHCache实例:
CacheManager cacheMgr = CacheManager.getInstance();
cacheMgr.setName("myCache");
CacheConfiguration cacheConfig = new CacheConfiguration(getCacheName(), 1)
.eternal(true)
.overflowToOffHeap(false)
.timeToLiveSeconds(0)
.maxEntriesLocalHeap(1)
.timeToIdleSeconds(0) .diskExpiryThreadIntervalSeconds(0);
Cache merchantCache = new Cache(cacheConfig);
cacheMgr.addCache(merchantCache);
merchantCache.put(new Element("key", "value"));
merchantCache.put(new Element("key1", "value"));
merchantCache.put(new Element("key2", "value"));
运行此代码,我没有任何异常。因为我使用maxEntriesLocalHeap
= 1创建了缓存,所以我希望得到一个例外,因为我在那里放了三个元素。
有谁能让我知道我做错了什么?
由于
答案 0 :(得分:1)
我认为您需要使用maxEntriesInCache
代替maxEntriesLocalHeap
,因为:http://ehcache.org/apidocs/net/sf/ehcache/config/CacheConfiguration.html#maxEntriesInCache
编辑:对于非群集的ehcache,请使用:maxElementsInMemory
答案 1 :(得分:0)
你没有做错任何事情......请检查以下所述的记忆驱逐政策: http://ehcache.org/documentation/user-guide/storage-options#memory-use-spooling-and-expiry-strategy
默认情况下(如果未指定memoryStoreEvictionPolicy),使用LRU(最近使用的)策略...意味着如果缓存中没有更多空间,则将逐出最旧命中的元素以便为您尝试将新元素放入缓存中。
因此,对于您的特定测试/代码,最终缓存中的密钥可能是每个驱逐策略的“key2”...当您输入“key1”时,“key”被驱逐,而当“key1”被驱逐时,“key1”被驱逐你输入了“key2”。
坦率地说,我不确定为什么你需要对缓存条目施加硬限制......而不是让它们自然地回收(可能会改变驱逐政策以使用LFU - 最后经常使用 - 所以你得到随着时间的推移,缓存条目在内存中的热点......
如果您使用带有BigMemory Max(http://terracotta.org/products/bigmemorymax)的群集缓存,则可以使用“maxEntriesInCache”设置硬限制(这仅适用于群集缓存)