2010-02-17 44 views
11

我正在嘗試爲僅在短時間內相關的數據創建一個jboss緩存。在那段時間之後,數據應該被丟棄並且相應的存儲空間被釋放。如何避免JBoss-Cache區域被驅逐?

緩存組織這樣的:

/my_region 
    /session_1 
     /datanode_1 
      attribute1: value1 
     /datanode_2 
      attribute2: value2 
    /session_2 
     ... 
    /session_3 
     ... 
    ... 
    ... 

而且我驅逐策略的配置是這樣的:

<attribute name="EvictionPolicyClass">org.jboss.cache.eviction.LRUPolicy</attribute> 
<attribute name="EvictionPolicyConfig"> 
    <config> 
     <attribute name="wakeUpIntervalSeconds">5</attribute>  
     <region name="/my_region"> 
    <attribute name="maxNodes">100</attribute> 
    <attribute name="timeToLiveSeconds">1800</attribute> 
     </region> 
    </config> 
</attribute> 

這工作:當/my_region獲得超過100個孩子,最近最少使用兒童被驅逐,使該地區縮減回100個孩子。

LRUPolicy的問題是,當被驅逐的節點有子女時,they're not completely removed, but marked with jboss:internal:uninitialized: null instead。這種行爲對於被緩存的實體來說是有意義的,以避免從持久存儲中獲取它們,但是它不適合緩存沒有被保存並且將不會再被訪問的實體。

因此,要刪除節點,我創建了一個擴展名爲LRUPolicy的文件,該文件覆蓋了帶有remove的evict。

@Override 
public void evict(Fqn fqn) throws Exception { 
    cache_.remove(fqn); 
} 

這一新政策不會留下joss:internal:uninitialized: null的背後,卻是達到maxNodes時刪除/my_region節點。當我把LRUPolicy放回去時,我注意到區域節點本身實際上被驅逐並獲得了unitialized標籤,但是最近使用的100個孩子仍然存在。

如何防止該地區本身被驅逐?有沒有更好的方式去除而不拆除eviction from expiration

我正在使用jboss緩存版本1.3.0.SP4。

+0

什麼版本的jboss緩存? – skaffman 2010-02-18 21:35:45

+0

1.3.0.SP4,我會將它包含在問題中。 – hvrauhal 2010-02-19 07:46:55

回答

5

你看過JBoss-Cache bugs repository嗎?


編輯:

看看這個JBoss的緩存錯誤,它似乎很重要:

https://jira.jboss.org/jira/browse/JBCACHE-921

固定在1.4.1.SP1

+0

這的確看起來相關,感謝您的研究! 我會在嘗試升級時告訴您是否確實解決了問題。 – hvrauhal 2010-04-26 11:25:08

+1

我更新到1.4.1.SP3(因爲這很容易在他們的Maven倉庫中獲得),並且確實解決了這個問題!所以就是那個導致內存泄漏的bug。 到目前爲止,它看起來像1.4.1.SP3是1.3.1.SP4的直接替代品。 謝謝你的研究,這使我的一天!下次我會記得在容易看到問題是否消失時先升級庫。 – hvrauhal 2010-04-28 12:36:08

0

通過編程,您可以將Cache區域設置爲常駐:

this.cache.getNode(fqn).setResident(true);