2010-02-17 7 views
11

Estoy tratando de crear un jboss-cache para los datos que solo son relevantes durante un corto período de tiempo. Después de ese tiempo, los datos deben descartarse y la memoria respectiva debe liberarse.¿Cómo evitar que la región JBoss-Cache sea desalojada?

La caché está organizado así:

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

y la configuración de mi política de desalojo se ve así:

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

Esto funciona: cuando /my_region obtiene más de 100 niños, los niños utilizados menos recientemente son desalojados para que la región se reduzca a 100 niños.

El problema con el LRUPolicy es que cuando los nodos desalojados tienen hijos, they're not completely removed, but marked with jboss:internal:uninitialized: null instead. Este comportamiento tiene sentido para las entidades que se almacenan en caché para evitar recuperarlas de un almacenamiento persistente, pero no es adecuado para las entidades de almacenamiento en caché que no se conservan y nunca se volverá a acceder a ellas.

Por lo tanto, para eliminar los nodos, he creado una extensión de LRUPolicy que anula el desalojo con la eliminación.

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

Esta nueva política no deja joss:internal:uninitialized: null 's detrás, pero elimina el nodo /my_region cuando se alcanza maxNodes. Cuando devolví el LRUPolicy, me di cuenta de que el nodo de la región en sí mismo es desalojado y recibe la etiqueta unitialized, pero los 100 últimos hijos que aún se usan permanecen.

¿Cómo puedo evitar que la región se desaloje? ¿Hay alguna forma mejor de eliminar en lugar de desalojar sin separar el eviction from expiration?

Estoy usando la versión 1.3.0.SP4 de jboss-cache.

+0

¿qué versión de jboss-cache? – skaffman

+0

1.3.0.SP4, lo incluiré en la pregunta. – hvrauhal

Respuesta

5

¿Has mirado en el JBoss-Cache bugs repository?


Editar:

Tome un vistazo a este error JBoss-Cache, parece bastante relevante:

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

fijados en 1.4.1.SP1

+0

¡De hecho parece relevante, gracias por la investigación! Te avisaré cuando haya intentado la actualización si realmente resolvió el problema. – hvrauhal

+1

Actualicé a 1.4.1.SP3 (ya que estaba fácilmente disponible en su repositorio maven) y eso soluciona el problema. Entonces fue ese error el que causó la pérdida de memoria. Hasta ahora parece que 1.4.1.SP3 fue un reemplazo directo para 1.3.1.SP4. Gracias por la investigación, esto hizo mi día!La próxima vez recordaré actualizar las bibliotecas primero cuando sea fácil ver si los problemas desaparecen. – hvrauhal

0

Programmically puede establecer la región de caché como residente:

this.cache.getNode(fqn).setResident(true); 
Cuestiones relacionadas