Как избежать выселения региона JBoss-Cache? - PullRequest
11 голосов
/ 17 февраля 2010

Я пытаюсь создать 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 заключается в том, что когда у выселенных узлов есть дочерние элементы, они не удаляются полностью, а отмечаются jboss:internal:uninitialized: null вместо . Это поведение имеет смысл для объектов, которые кэшируются, чтобы избежать их извлечения из постоянного хранилища, но оно не подходит для объектов кэширования, которые не сохраняются и никогда не будут доступны снова.

Итак, чтобы удалить узлы, я создал расширение LRUPolicy, которое переопределяет evict с помощью remove.

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

Эта новая политика не оставляет позади joss:internal:uninitialized: null, но удаляет узел /my_region при достижении maxNodes. Когда я положил LRUPolicy обратно, я заметил, что сам узел региона фактически выселяется и получает тег unitialized, но 100 последних использованных потомков все еще остаются.

Как я могу предотвратить выселение самого региона? Есть ли какой-нибудь лучший способ сделать удаление вместо выселения, не отделяя выселение от истечения ?

Я использую jboss-cache версии 1.3.0.SP4.

Ответы [ 2 ]

5 голосов
/ 15 апреля 2010

Вы смотрели в хранилище ошибок JBoss-Cache ?


Редактировать:

Взгляните на эту ошибку JBoss-Cache, она кажется весьма актуальной:

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

Исправлено в 1.4.1.SP1

0 голосов
/ 13 февраля 2013

Программно вы можете установить область кэша в качестве резидента:

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