我正在尝试为只在短时间内相关的数据创建一个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放回时,我注意到region节点本身实际上被逐出并获得了unitialized标记,但最近使用的100个子节点仍然保留。
如何防止区域本身被驱逐?有没有更好的方法在不分离eviction from expiration的情况下执行删除而不是逐出
我使用的是jboss-cache版本1.3.0.SP4。
发布于 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中修复
发布于 2013-02-13 16:02:13
您可以通过编程将Cache region设置为resident:
this.cache.getNode(fqn).setResident(true);https://stackoverflow.com/questions/2281053
复制相似问题