首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何避免JBoss-Cache区域被驱逐?

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

Stack Overflow用户
提问于 2010-02-17 21:42:10
回答 2查看 1.6K关注 0票数 11

我正在尝试为只在短时间内相关的数据创建一个jboss-cache。在此之后,应该丢弃数据并释放相应的内存。

缓存的组织方式如下:

代码语言:javascript
复制
/my_region
    /session_1
        /datanode_1
          attribute1: value1
        /datanode_2
          attribute2: value2
    /session_2
        ...
    /session_3
        ...
    ...
    ...

我的驱逐策略配置如下所示:

代码语言:javascript
复制
<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。

代码语言:javascript
复制
@Override
public void evict(Fqn fqn) throws Exception {
    cache_.remove(fqn);
}

这个新策略不会丢弃joss:internal:uninitialized: null,但当到达maxNodes时,它会删除/my_region节点。当我将LRUPolicy放回时,我注意到region节点本身实际上被逐出并获得了unitialized标记,但最近使用的100个子节点仍然保留。

如何防止区域本身被驱逐?有没有更好的方法在不分离eviction from expiration的情况下执行删除而不是逐出

我使用的是jboss-cache版本1.3.0.SP4。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-04-15 18:54:26

你有没有看过JBoss-Cache bugs repository

编辑:

看看这个JBoss-Cache bug,它看起来很相关:

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

已在1.4.1.SP1中修复

票数 5
EN

Stack Overflow用户

发布于 2013-02-13 16:02:13

您可以通过编程将Cache region设置为resident:

代码语言:javascript
复制
this.cache.getNode(fqn).setResident(true);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2281053

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档