2010-02-17 3 views
11

짧은 기간에만 관련있는 데이터에 대해 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입니다. 이 동작은 영구 저장소에서 캐시를 가져 오지 않도록 캐시 된 엔터티에 적합하지만 지속되지 않고 다시 액세스 할 수없는 엔터티를 캐싱하는 데는 적합하지 않습니다.

따라서 노드를 제거하려면 evict를 remove로 대체하는 LRUPolicy이라는 확장자를 작성했습니다.

@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를 사용하고 있습니다.

+0

jboss-cache의 버전은 무엇입니까? – skaffman

+0

1.3.0.SP4, 질문에 포함하겠습니다. – hvrauhal

답변

5

JBoss-Cache bugs repository을 보셨습니까?


편집 :

이 JBoss에 캐시 버그를 살펴 보자, 꽤 관련 보인다

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

이 1.4.1.SP1

+0

실제로 관련성이있어 보입니다. 조사해 주셔서 감사합니다! 실제로 문제를 해결했는지 여부를 업그레이드를 시도 할 때 알려 드리겠습니다. – hvrauhal

+1

1.4.1.SP3으로 업데이트되었으므로 (실제로 해당 Maven 저장소에서 사용 가능함) 실제로 문제가 해결되었습니다! 그래서 메모리 누수를 일으킨 버그였습니다. 지금까지 1.4.1.SP3은 1.3.1.SP4의 드롭 인 대체품이었습니다. 연구 해 주셔서 감사합니다.다음 번에는 문제가 없어지는지 쉽게 알 수있을 때 라이브러리를 먼저 업그레이드하는 것을 기억하겠습니다. – hvrauhal

0

에서 해결 프로그래밍 방식으로 캐시 영역을 거주자로 설정할 수 있습니다.

this.cache.getNode(fqn).setResident(true); 
관련 문제