2010-02-17 7 views
11

J'essaye de créer un jboss-cache pour les données qui ne sont pertinentes que pour une courte période de temps. Après cette période, les données doivent être supprimées et la mémoire respective libérée.Comment éviter que la région JBoss-Cache ne soit expulsée?

Le cache est organisé comme ceci:

/my_region 
    /session_1 
     /datanode_1 
      attribute1: value1 
     /datanode_2 
      attribute2: value2 
    /session_2 
     ... 
    /session_3 
     ... 
    ... 
    ... 

Et ma configuration de la politique d'expulsion ressemble à ceci:

<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> 

Cela fonctionne: quand /my_region obtient plus de 100 enfants, les enfants moins récemment utilisés sont expulsés pour que la région rétrécisse à 100 enfants.

Le problème avec le LRUPolicy est que lorsque les nœuds expulsés ont des enfants, they're not completely removed, but marked with jboss:internal:uninitialized: null instead. Ce comportement est logique pour les entités mises en cache afin d'éviter de les extraire d'un stockage persistant, mais il ne convient pas à la mise en cache des entités qui ne sont pas persistantes et qui ne seront jamais accessibles à nouveau. Donc, pour supprimer les noeuds, j'ai créé une extension de LRUPolicy qui remplace expict avec remove.

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

Cette nouvelle politique ne laisse pas joss:internal:uninitialized: null « s derrière, mais il supprime le nœud /my_region lorsque maxNodes est atteint. Lorsque j'ai mis le LRUPolicy en arrière, j'ai remarqué que le nœud de région lui-même est effectivement expulsé et reçoit la balise unitialized, mais les 100 derniers enfants utilisés restent toujours. Comment puis-je empêcher l'expulsion de la région elle-même?

Y a-t-il une meilleure façon de faire l'enlèvement au lieu de l'expulsion sans séparer le eviction from expiration? J'utilise jboss-cache version 1.3.0.SP4.

+0

quelle version de jboss-cache? – skaffman

+0

1.3.0.SP4, je vais l'inclure dans la question. – hvrauhal

Répondre

5

Avez-vous regardé dans le JBoss-Cache bugs repository?


Edit:

Jetez un oeil à ce bug JBoss Cache, il semble tout à fait pertinent:

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

fixe dans 1.4.1.SP1

+0

Cela semble en effet pertinent, merci pour la recherche! Je vous tiendrai au courant lorsque j'aurai essayé la mise à niveau, si elle a effectivement résolu le problème. – hvrauhal

+1

J'ai mis à jour à 1.4.1.SP3 (comme c'était facilement disponible dans leur dépôt maven) et cela corrige en effet le problème! C'est donc ce bug qui a causé la fuite de mémoire. Jusqu'à présent, il semble que le 1.4.1.SP3 était un remplacement direct de 1.3.1.SP4. Merci pour la recherche, cela a fait ma journée!La prochaine fois, je me souviendrai de mettre à jour les bibliothèques en premier quand il est facile de voir si les problèmes disparaissent. – hvrauhal

0

Par programme, vous pouvez définir la région du cache en tant que résident:

this.cache.getNode(fqn).setResident(true); 
Questions connexes