0

我正在创建一个这样的 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"));

运行这段代码,我没有得到任何异常。因为我使用 = 1 创建了缓存maxEntriesLocalHeap,所以我希望得到一个异常,因为我在那里放了三个元素。

谁能让我知道我做错了什么?

谢谢

4

2 回答 2

1

我相信你需要使用maxEntriesInCache而不是maxEntriesLocalHeap按照:http ://ehcache.org/apidocs/net/sf/ehcache/config/CacheConfiguration.html#maxEntriesInCache

编辑:对于非集群 ehcache 使用:maxElementsInMemory

于 2013-08-14T11:54:47.123 回答
0

你没有做错任何事......请检查以下描述的内存驱逐策略:http: //ehcache.org/documentation/user-guide/storage-options#memory-use-spooling-and-expiry-strategy

默认情况下(如果未指定 memoryStoreEvictionPolicy),则使用 LRU(最近使用的)策略...这意味着如果缓存中没有更多空间,则最旧命中的元素将被逐出以为新元素腾出空间'正在尝试放入您的缓存中。

因此,对于您的特定测试/代码,您最后在缓存中的密钥可能是每个驱逐策略的“key2”......当您输入“key1”时“key”被驱逐,当您输入“key1”时“key1”被驱逐键 2"。

坦率地说,我不确定您为什么需要以这种方式对缓存条目进行硬性限制......而不是让它们自然回收(也许将驱逐策略更改为使用 LFU - 最后经常使用 - 所以你会随着时间的推移内存中缓存条目的热点...

如果您使用 BigMemory Max ( http://terracotta.org/products/bigmemorymax ) 的集群缓存,您可以使用“maxEntriesInCache”设置硬限制(这仅对集群缓存有效)

于 2013-08-14T17:09:06.140 回答