2012-01-06 9 views
5

मैं न केवल कैश के रूप में ehcache का उपयोग करना चाहता हूं, बल्कि गंदे ऑब्जेक्ट्स के कंटेनर के रूप में उपयोग करना चाहता हूं, जब मैं ऑब्जेक्ट निष्कासित/समाप्त हो जाता हूं तो मैं अपने डेटाबेस में फ्लश करना चाहता हूं। सामान्य प्रसंस्करण के दौरान, मैं ehcache में देखने के लिए एक कुंजी का उपयोग करता हूं। यदि कुंजी मौजूद नहीं है, तो मैं डेटाबेस से डेटा पढ़ता हूं और इसे ehcache में डालता हूं। मूल्य वास्तव में एक जटिल वस्तु है जिसे मैं संशोधित करता हूं। जब ttl/निष्क्रिय समय/अतिप्रवाह स्थिति होती है, तो मुझे लगता है कि कैशइवेंट लिस्टनर कॉलबैक आते हैं। लेकिन एक बड़ी समस्या है। अधिसूचनाएलेमेंट एक्स्पेरड को कैश से कुंजी-मूल्य हटा दिए जाने के बाद बुलाया जाता है। तो एक दौड़ की स्थिति है। अगर मैं अधिसूचना में कैश करने के लिए गंदे मान को फ़्लश करने का कार्य करता हूं। एलिमेंट एक्सपेरियड और साथ ही, एक और थ्रेड में, उसी कुंजी के लिए पढ़ा जाता है, फिर एक सिंक्रनाइज़ेशन समस्या होती है। दूसरा धागा ehcache में ऑब्जेक्ट नहीं मिलेगा, और इसलिए डेटाबेस पर जाएगा जबकि अन्य थ्रेड अभी भी फ्लश करने के लिए तैयार हो रहा है।क्या इस प्रयोग के मामले को कभी भी ehcache में काम किया जा सकता है?

मैंने लिखने के माध्यम से ehcache के साथ प्रयोग करने की कोशिश की और मुझे नहीं लगता कि यह भी काम कर रहा है।

क्या कोई समाधान है ??

मैं वास्तव में इस समस्या के अच्छे समाधान की सराहना करता हूं, भले ही इसमें एशैच के अलावा कुछ अन्य कैशिंग तंत्र शामिल हों।

धन्यवाद

+0

मुझे इस प्रश्न का कोई जवाब नहीं मिला। तो मैं आगे बढ़ गया और इसे हल कर लिया! यहां समाधान है जिसे मैंने ब्लॉग किया - http://blog.readypulse.com/2012/01/08/ehcache-as-a-true-persistent-store-backed-cache/ –

+1

अच्छा काम टीवीइनोड गुप्ता। एक दोस्ताना अनुस्मारक के रूप में, क्या आप अपने आप को प्रश्न का उत्तर पोस्ट कर सकते हैं और फिर उस उत्तर को स्वीकार कर सकते हैं ताकि हम इस प्रश्न को बंद कर सकें? साथ ही, यदि आप अपनी समस्या को ठीक करते हैं तो आपको पिछले प्रश्नों के उत्तर स्वीकार करने की आवश्यकता है। – Zecas

उत्तर

1

आप एक विशुद्ध रूप से इन-मेमोरी कैश के साथ ठीक कर रहे हैं, मैं Google Guava लाइब्रेरी की CacheLoader, पूर्व विस्तार सुझाव देंगे: उपयोग में फिर

public class DBLoader extends CacheLoader<String, String> { 

    @Override 
    public String load(String key) throws Exception { 
     // load a value from the database 
     return value; 
    } 
} 

, कुछ की तरह:

private LoadingCache<String, String> dbCache = CacheBuilder.newBuilder() 
.expireAfterWrite(CACHE_EXPIRE_IN_SECONDS, TimeUnit.SECONDS) 
.build(new DBLoader()); 

String value = dbCache.get(someKey); 


आपको उचित अपवाद प्रबंधन के साथ इसे साफ करने की आवश्यकता होगी।

मुझे अमरूद को ठीक से कॉन्फ़िगर करने के बजाय अमरूद को अधिक सरल होना चाहिए।

+1

अमरूद की अपनी दौड़ की स्थिति है: https://github.com/google/guava/issues/1881 – CurtainDog

संबंधित मुद्दे