2016-08-01 77 views
0

我在web應用中使用Ehcache 2.8.8的LRU策略,當沒有-Dnet時使用 。 sf.ehcache.use.classic.lru = true Ehcache尊重我的maxBytesLocalHeap參數; 但在設置系統屬性時不這樣做。爲什麼Ehcache 2.8.8在使用-Dnet.sf.ehcache.use.classic.lru = true時忽略我的maxBytesLocalHeap參數

在二級緩存:

if (useClassicLru && onfiguration.getMemoryStoreEvictionPolicy(). 
equals(MemoryStoreEvictionPolicy.LRU)) { 
    Store disk = createDiskStore(); 
    store = new LegacyStoreWrapper(new LruMemoryStore(this, disk), 
      disk, registeredEventListeners, configuration); 
} else { 
    if (configuration.isOverflowToDisk()) { 
     store = DiskStore.createCacheStore(this, onHeapPool, 
       onDiskPool); 
    } else { 
     store = MemoryStore.create(this, onHeapPool); 
    } 
} 

,並在類LruMemoryStore:

public LruMemoryStore(Ehcache cache, Store diskStore) { 
    status = Status.STATUS_UNINITIALISED; 
    this.maximumSize = 
     cache.getCacheConfiguration().getMaxEntriesLocalHeap(); 
    this.cachePinned = 
     determineCachePinned(cache.getCacheConfiguration()); 
    this.elementPinningEnabled = 
     !cache.getCacheConfiguration().isOverflowToOffHeap(); 
    this.cache = cache; 
    this.diskStore = diskStore; 
    if (cache.getCacheConfiguration().isOverflowToDisk()) { 
     evictionObserver = null; 
    } else { 
     evictionObserver = 
      StatisticBuilder.operation(EvictionOutcome.class). 
      named("eviction").of(this).build(); 
    } 
    map = new SpoolingLinkedHashMap(); 
    status = Status.STATUS_ALIVE; 
    copyStrategyHandler = MemoryStore.getCopyStrategyHandler(cache); 
} 

所以我想只有MaxEntriesLocalHeap有效果呢?

是否可以將其設置爲jvm系統屬性?

回答

0

當您明確請求經典的LRU時,實際上您獲得的內部代碼的舊版本被保留,因爲某些用戶依賴於其行爲。

這意味着您實際上無法使用此後引入的功能,包括以字節爲單位調整堆層的大小。

所以你是對的,只有maxEntriesLocalHeap將允許你調整堆層的大小。這不能通過系統屬性來設置。

+0

選擇經典LRU有沒有什麼懲罰? DiskStore和MemoryStore之間的主要區別是什麼? – user1532146

+0

使用DiskStore時,是否意味着Ehcache將使用本地磁盤?如果是的話,它多久使用一次?需要在本地磁盤上準備多少空間? – user1532146

+0

當我只想在堆內存存儲中使用經典的LRU驅逐策略時,最佳解決方案是什麼? – user1532146

相關問題