如何避免JBoss-Cache区域被驱逐?

时间:2010-02-17 13:42:10

标签: java caching jboss jboss-cache

我正在尝试为仅在短时间内相关的数据创建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。

2 个答案:

答案 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);