我正在尝试为仅在短时间内相关的数据创建一个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。
什么版本的jboss缓存? – skaffman 2010-02-18 21:35:45
1.3.0.SP4,我会将它包含在问题中。 – hvrauhal 2010-02-19 07:46:55