2010-02-17 30 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);