11

我正在尝试为仅在短时间内相关的数据创建一个 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在于,当被驱逐的节点有子节点时,它们并没有被完全删除,而是用jboss:internal:uninitialized: null标记。这种行为对于被缓存以避免从持久存储中获取它们的实体是有意义的,但它不适合缓存未持久且永远不会再次访问的实体。

所以,为了删除节点,我创建了一个扩展,LRUPolicy用 remove 覆盖了 evict。

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

此新策略不会留下joss:internal:uninitialized: null',但会在到达/my_region时删除节点maxNodes。当我放回LRUPolicy后面时,我注意到区域节点本身实际上被驱逐并获得了unitialized标签,但最近使用的 100 个子节点仍然存在。

如何防止该区域本身被驱逐?有没有更好的方法来进行移除而不是驱逐而不将驱逐与过期分开?

我正在使用 jboss-cache 版本 1.3.0.SP4。

4

2 回答 2

5

您查看过JBoss-Cache 错误存储库吗?


编辑:

看看这个 JBoss-Cache 错误,它似乎很相关:

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

已在 1.4.1.SP1 中修复

于 2010-04-15T10:54:26.367 回答
0

以编程方式,您可以将缓存区域设置为常驻:

this.cache.getNode(fqn).setResident(true);
于 2013-02-13T08:02:13.480 回答