我正在尝试为仅在短时间内相关的数据创建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
,但会在达到/my_region
时删除maxNodes
节点。当我放回LRUPolicy
时,我注意到区域节点本身实际上已被驱逐并获得unitialized
标记,但最近使用的100个孩子仍然存在。
如何防止该区域被驱逐?在没有分离eviction from expiration的情况下,有没有更好的方法来删除而不是驱逐?
我正在使用jboss-cache版本1.3.0.SP4。
答案 0 :(得分:5)
你看过JBoss-Cache bugs repository吗?
修改:
看看这个JBoss-Cache错误,看起来非常相关:
https://jira.jboss.org/jira/browse/JBCACHE-921
已在1.4.1.SP1中修复
答案 1 :(得分:0)
以编程方式,您可以将缓存区域设置为驻留:
this.cache.getNode(fqn).setResident(true);