2010-02-17 20 views
11

Sadece kısa bir süre için geçerli olan veriler için bir jboss önbellek oluşturmaya çalışıyorum. Bu süreden sonra veriler atılmalı ve ilgili hafıza boşaltılmalıdır.JBoss-Cache bölgesinin tahliye edilmesinden nasıl korunulur?

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

Ve tahliye politikası yapılandırma şöyle görünür:

önbellek böyle düzenlenmiştir

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

Bu çalışır: /my_region 100'den fazla çocuk, en önce kullanılan çocuklar aldığında Bölge tahliye edilir ve böylece bölge 100 çocuğa geri çekilir.

LRUPolicy ile ilgili sorun, tahliye edilen düğümlerin they're not completely removed, but marked with jboss:internal:uninitialized: null instead numaralı çocuğa sahip olmasıdır. Bu davranış, kalıcı bir depodan getirilmekten kaçınmak için önbelleğe alınan varlıklar için mantıklıdır, ancak kalıcı olmayan ve hiçbir zaman erişilemeyen öğelerin önbelleğe alınması için uygun değildir.

Düğümleri kaldırmak için, kaldırmayla birlikte geçersiz kılmayı geçersiz kılan bir LRUPolicy uzantısı oluşturdum.

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

Bu yeni politika arkasında joss:internal:uninitialized: null 's bırakmaz fakat maxNodes ulaşıldığında o /my_region düğümünü kaldırır. LRUPolicy'u geri yüklediğimde, bölge düğümünün kendisinin gerçekten tahliye edildiğini ve unitialized etiketini aldığını fark ettim, ancak en son kullanılmış 100 çocuk hala duruyor.

Bölgenin kendisinin tahliye edilmesini nasıl önleyebilirim? eviction from expiration'u ayırmadan tahliye yerine kaldırmanın daha iyi bir yolu var mı?

jboss-cache sürüm 1.3.0.SP4 kullanıyorum.

+0

jboss-cache'in hangi sürümü var? – skaffman

+0

1.3.0.SP4, soruya ekleyeceğim. – hvrauhal

cevap

5

JBoss-Cache bugs repository'a baktınız mı?


Düzenleme:

bu JBoss-Cache böcek bir göz atın, oldukça alakalı görünüyor:

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

1.4.1.SP1

+0

Gerçekten alakalı görünüyor, araştırma için teşekkürler! Güncelleştirmeyi denediğimde sorunun gerçekten çözülüp çözülmediğini size bildireceğim. – hvrauhal

+1

1.4.1.SP3 ile güncelledim (maven depolarında kolayca bulunabiliyor) ve bu gerçekten de sorunu çözüyor! Yani bellek sızıntısına neden olan böcek oldu. Şimdiye kadar 1.4.1.SP3, 1.3.1.SP4 için bir açılan eklentiydi. Araştırma için teşekkürler, bu benim günümü yarattı!Bir dahaki sefere problemlerin ortadan kalkıp gitmediğini görmek kolay olduğunda kütüphaneleri yükseltmeyi hatırlıyorum. – hvrauhal

0

giderilen Programsal olarak Önbellek bölgesini yerleşik olarak ayarlayabilirsiniz:

this.cache.getNode(fqn).setResident(true); 
İlgili konular