2010-02-17 2 views
11

मैं डेटा के लिए एक jboss-cache बनाने की कोशिश कर रहा हूं जो कि केवल थोड़े समय के लिए प्रासंगिक है। उस समय के बाद डेटा को त्याग दिया जाना चाहिए और संबंधित स्मृति मुक्त हो गई।जेबॉस-कैश क्षेत्र से बेदखल होने से कैसे बचें?

कैश इस तरह का आयोजन किया जाता है:

/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 के साथ समस्या यह है कि जब बेदखल नोड्स में बच्चे होते हैं, they're not completely removed, but marked with jboss:internal:uninitialized: null instead। यह व्यवहार उन संस्थाओं के लिए समझ में आता है जो उन्हें लगातार भंडारण से बचने से बचने के लिए कैश किए जाते हैं, लेकिन यह उन इकाइयों को कैशिंग करने के लिए उपयुक्त नहीं है जो लगातार नहीं बने रहेंगे और कभी भी इसका उपयोग नहीं किया जाएगा।

तो, नोड्स को हटाने के लिए, मैंने LRUPolicy का विस्तार बनाया है जो निकालने के साथ बेदखल ओवरराइड करता है।

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

इस नई नीति को पीछे छोड़ नहीं करता है joss:internal:uninitialized: null की, लेकिन जब maxNodes तक पहुँच जाता है यह /my_region नोड निकाल देता है। जब मैंने LRUPolicy वापस रख दिया, मैंने देखा कि क्षेत्र नोड वास्तव में बेदखल हो जाता है और unitialized टैग प्राप्त करता है, लेकिन 100 सबसे हाल ही में उपयोग किए जाने वाले बच्चे अभी भी बने रहते हैं।

मैं इस क्षेत्र को खुद को बेदखल करने से कैसे रोक सकता हूं? क्या eviction from expiration को अलग किए बिना निष्कासन के बजाय हटाने का कोई बेहतर तरीका है?

मैं jboss-cache संस्करण 1.3.0.SP4 का उपयोग कर रहा हूं।

+0

jboss-cache का कौन सा संस्करण? – skaffman

+0

1.3.0.एसपी 4, मैं इसे प्रश्न में शामिल करूंगा। – hvrauhal

उत्तर

5

क्या आपने JBoss-Cache bugs repository देखा था?


संपादित करें:

इस JBoss-कैश बग पर एक नजर डालें, यह काफी प्रासंगिक लगता है:

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

1.4.1.SP1

+0

वह वास्तव में प्रासंगिक दिखता है, अनुसंधान के लिए धन्यवाद! जब मैं अपग्रेड करने का प्रयास करता हूं तो क्या मैं आपको बता दूंगा कि क्या वास्तव में समस्या हल हो गई है। – hvrauhal

+1

मैंने 1.4.1.एसपी 3 को अपडेट किया (जैसा कि यह उनके मैवेन रिपोजिटरी में आसानी से उपलब्ध था) और वास्तव में समस्या को हल करता है! तो यह वह बग था जो स्मृति रिसाव का कारण बनता था। अब तक ऐसा लगता है कि 1.4.1.SP3 1.3.1.SP4 के लिए एक ड्रॉप-इन प्रतिस्थापन था। अनुसंधान के लिए धन्यवाद, यह मेरा दिन बना दिया!अगली बार मुझे लाइब्रेरी को अपग्रेड करना याद होगा जब यह देखना आसान होगा कि समस्याएं दूर हैं या नहीं। – hvrauhal

0

में फिक्स्ड प्रोग्रामिक रूप से आप कैश क्षेत्र को निवासी के रूप में सेट कर सकते हैं:

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