【发布时间】:2011-01-17 20:56:18
【问题描述】:
我正在尝试为仅在短时间内相关的数据创建一个 jboss 缓存。在那之后,应该丢弃数据并释放相应的内存。
缓存是这样组织的:
/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 放回去时,我注意到区域节点本身实际上被逐出并获得了unitialized 标记,但最近使用的100 个子节点仍然存在。
如何防止该区域本身被驱逐?有没有更好的方法可以在不分离eviction from expiration的情况下进行删除而不是驱逐?
我使用的是 jboss-cache 版本 1.3.0.SP4。
【问题讨论】:
-
1.3.0.SP4,我会把它包含在问题中。
标签: java caching jboss jboss-cache