2010-02-17 19 views
11

Sto provando a creare un jboss-cache per i dati che sono rilevanti solo per un breve periodo di tempo. Dopo questo tempo i dati dovrebbero essere scartati e la relativa memoria liberata.Come evitare che la regione JBoss-Cache venga espulsa?

La cache è organizzata in questo modo:

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

E la mia configurazione dei criteri di sfratto è simile al seguente:

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

Questo funziona: quando /my_region ottiene più di 100 bambini, i bambini meno utilizzati di recente sono sfrattati in modo che la regione si riduca a 100 bambini.

Il problema con lo LRUPolicy è che quando i nodi espulsi hanno figli, they're not completely removed, but marked with jboss:internal:uninitialized: null instead. Questo comportamento ha senso per le entità che vengono memorizzate nella cache per evitare di recuperarle da una memoria persistente, ma non è adatto per le entità di memorizzazione nella cache che non sono persistenti e non saranno mai più accessibili.

Quindi, per rimuovere i nodi, ho creato un'estensione di LRUPolicy che sovrascrive sfratto con rimuovere.

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

Questa nuova politica non lascia joss:internal:uninitialized: null 's dietro, ma rimuove il nodo /my_region quando maxNodes è raggiunto. Quando ho ripristinato il LRUPolicy, ho notato che il nodo regione in realtà viene espulso e ottiene il tag unitialized, ma i 100 bambini ancora utilizzati più di recente rimangono.

Come posso evitare che la regione stessa venga sfrattata? C'è un modo migliore per eseguire la rimozione anziché lo sfratto senza separare lo eviction from expiration?

Sto usando jboss-cache versione 1.3.0.SP4.

+0

quale versione di jboss-cache? – skaffman

+0

1.3.0.SP4, lo includerò nella domanda. – hvrauhal

risposta

5

Hai cercato nel JBoss-Cache bugs repository?


Edit:

Date un'occhiata a questo bug JBoss Cache-, sembra piuttosto rilevanti:

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

fissato in 1.4.1.SP1

+0

Che sembra davvero rilevante, grazie per la ricerca! Ti farò sapere quando ho provato l'aggiornamento se ha effettivamente risolto il problema. – hvrauhal

+1

Ho aggiornato a 1.4.1.SP3 (dato che era facilmente disponibile nel loro repository di Maven) e questo risolve il problema! Quindi è stato quel bug che ha causato la perdita di memoria. Finora sembra che 1.4.1.SP3 sia stato un rimpiazzo per 1.3.1.SP4. Grazie per la ricerca, questo ha reso la mia giornata!La prossima volta ricorderò di aggiornare prima le librerie quando è facile vedere se i problemi scompaiono. – hvrauhal

0

Programmaticamente puoi impostare la regione cache come residente:

this.cache.getNode(fqn).setResident(true); 
Problemi correlati