Как избежать выселения региона JBoss-Cache?

Я пытаюсь создать 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, которое переопределяет "выселить" на "удалить".

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


person hvrauhal    schedule 17.02.2010    source источник
comment
1.3.0.SP4, Включу в вопрос.   -  person hvrauhal    schedule 19.02.2010


Ответы (2)


Вы просматривали репозиторий ошибок JBoss-Cache?


Изменить:

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

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

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

person Eran Medan    schedule 15.04.2010
comment
Это действительно выглядит актуальным, спасибо за исследование! Я дам вам знать, когда попробую выполнить обновление, действительно ли оно решило проблему. - person hvrauhal; 26.04.2010
comment
Я обновился до 1.4.1.SP3 (поскольку он был легко доступен в их репозитории maven), и это действительно решает проблему! Значит, именно эта ошибка вызвала утечку памяти. Пока что похоже, что 1.4.1.SP3 был прямой заменой 1.3.1.SP4. Спасибо за исследование, это сделало мой день лучше! В следующий раз я не забуду сначала обновить библиотеки, когда будет легко увидеть, исчезнут ли проблемы. - person hvrauhal; 28.04.2010

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

this.cache.getNode(fqn).setResident(true);
person mel3kings    schedule 13.02.2013