2010-12-17 12 views
6

मैं एएचकेएच के सजावट SelfPopulatingCache का उपयोग कर रहा हूं और जब कोई कैश नई प्रविष्टि लोड करने का प्रयास करता है तो कोई समस्या होती है, लेकिन यह अस्तित्वहीन नहीं है (यानी यह डेटाबेस में मौजूद नहीं है)। तो कैश किसी भी अन्य कुंजी को अनब्लॉक करने के लिए कैश में null मान डाल देगा, लेकिन फिर अगला थ्रेड उसी डेटाबेस कॉल करेगा क्योंकि इसे कैश से 'शून्य' प्राप्त हुआ था। जिसका अर्थ है कि यह सोचता है कि प्रविष्टि को लोड करने की आवश्यकता है - भले ही वास्तविकता में यह शून्य है क्योंकि डेटा कहीं भी मौजूद नहीं है। मुझे लगता है कि मैं कुछ गलत कर रहा हूँ।Ehcache - डेटा मौजूद नहीं होने पर SelfPopulatingCache का उपयोग

(छद्म कोड)

Value v = cache.get(key); // multiple threads will block here 
if (v == null) 
    cache.put(key, getValueFromDB()); // this might put a null value 

मेरे वर्तमान समाधान रिक्त नहीं डाल करने के लिए, लेकिन एक प्लेसहोल्डर Object रख दिया और यह जांच करने के लिए है।

Value v = cache.get(key); 
if (v == null) 
    cache.put(key, getValueFromDB()); 
else if (v == NOENTRYOBJECT) 
    return null; 
else 
    return v; 

विचार?

+0

मुझे स्पष्ट नहीं है कि आपका छद्म कोड 'SelfPopulatingCache' से कैसे संबंधित है। आप इसका उपयोग कैसे कर रहे हैं? – skaffman

+0

कैश = SelfPopulatingCache (या BlockingCache) ... सोचा था कि बहुत स्पष्ट – Gandalf

उत्तर

3

हम कुछ ऐसा करते हैं। हमारे मामले में, हम Boolean.FALSE को कैश में दर्ज करते हैं यदि अनुरोध की गई कुंजी वैध आइटम से मेल नहीं खाती है। यह मूल रूप से कॉलिंग कोड को बताता है कि जिस कुंजी के लिए उसने पूछा वह किसी भी डेटा से मेल नहीं खाता है। आपको उस कुंजी के पहले अनुरोध पर डीबी को एक कॉल करने की आवश्यकता है, यह पता लगाने के लिए कि यह मान्य डेटा के अनुरूप नहीं है, लेकिन बाद की कॉल डीबी लुकअप से बचा है। बेशक, यदि डेटा उस कुंजी के लिए डीबी में कभी भी दर्ज किया जाता है, तो आपको उस कैश एंट्री को अमान्य करना सुनिश्चित करना होगा (अन्यथा आप वास्तविक डेटा उपलब्ध होने के बावजूद Boolean.FALSE लौट रहे होंगे)।

सुनिश्चित नहीं है कि मेरी प्रतिक्रिया उसमें बहुत मदद करती है (यह एक वैकल्पिक दृष्टिकोण नहीं है), लेकिन कम से कम यह मान्य करता है कि आप अपने दृष्टिकोण में अकेले नहीं हैं।

बीटीडब्ल्यू, मुझे नहीं लगता कि यह ईएचसीएच के सेल्फपोप्लेटिंग कैश के लिए अद्वितीय है।

1

विशिष्ट पैटर्न डेटाबेस पुनः जाँच करने के लिए नहीं है, तो आइटम की कुंजी कैश में सब पर मौजूद है, बल्कि मूल्य से है।

पैटर्न यहां ehcache दस्तावेज़ों में वर्णित है: Caching Empty Values

आमतौर पर, लेकिन हमेशा नहीं, get एक Element देता है, तो get(id) अशक्त नहीं होगा अगर put(id, value) कभी पहले से बुलाया गया था, भले ही मान शून्य है।

ध्यान दें कि यह कैश कार्यान्वयन पर निर्भर करता है। Ehcache प्रलेखन का सुझाव है कि यह हमेशा काम करना चाहिए, लेकिन BlockingCache (और इसके वंशज) does NOT allow putting null values into the cache। आधार ehcache Cache ऑब्जेक्ट कैश में शून्य मानों को संग्रहीत करने की अनुमति देता है (जैसा कि कई उदाहरण और कस्टम कार्यान्वयन करते हैं)।

सब में मैं समाधान आप पहले से ही (प्लेसहोल्डर मूल्य वस्तु) है, भी काम करता है और ehcache आधार Cache वर्ग और प्रलेखन के रूप में एक ही परिणाम प्राप्त करने चाहिए।

+0

असल में यह सच नहीं है - यदि आप ब्लॉकिंग कैश और पुट (..) विधि के लिए कोड देखते हैं - यदि मान == शून्य है तो यह कुंजी को हटा देता है कैश। तो डाल दें (आईडी, शून्य) प्रभावी रूप से कैश में कुछ भी नहीं डालता है, अगली बार आईडी के लिए शून्य - नहीं और तत्व वापस आ जाएगा। – Gandalf

+0

हम्म। मैंने कोड को नहीं देखा है, इसलिए यह निश्चित स्रोत होगा। लेकिन फिर यह एहैचे दस्तावेज़ों का पूरी तरह से विरोधाभास प्रतीत होता है। मुझे यकीन नहीं है कि "कैशिंग रिक्त मान" कैसा उदाहरण होगा यदि आप एक शून्य मान कैश नहीं कर सकते हैं (यह स्पष्ट रूप से आपको ऐसा करने के लिए कहता है)। जब मुझे मौका मिलता है तो मैं कोड पर नजदीक देखता हूं, लेकिन मुझे लगता है * मुझे याद है कि अतीत में ऐसा किया गया था और यह ठीक काम करता था (यकीन नहीं है कि आप दिमाग, अस्पष्ट यादें, मैं पुष्टि करने के लिए एक सरल परीक्षण भी लिखूंगा /मना)। –

+0

मुझे लगता है कि यह क्या है। मेरा कैश कार्यान्वयन ईएचकेएसी इम्प्लेक्स में से किसी एक का उपयोग नहीं कर रहा है, या निश्चित रूप से SelfPopulatingCache। मेरी पुट विधि एक बुलियन का उपयोग करती है जो कैश कार्यान्वयन पर सेट है: putNullInCache। यह सच में चूक जाता है, और इसलिए शून्य को स्टोर करने की अनुमति देता है। तो यह कैश इम्प्ल पर निर्भर करता है, और आप SelfPopulatingCache के बारे में पूरी तरह से सही हैं। जब मुझे मौका मिलता है तो मैं किसी के लिए भविष्य के संदर्भ के लिए अपना "उत्तर" अपडेट करूंगा - लेकिन यह वास्तव में गलत है;)। मुझे लगता है कि आप जो कर रहे हैं वह वही शुद्ध प्रभाव है। –

0

मुझे लगता है कि आपको CacheElementFactory में देखने की आवश्यकता है। मैंने इसे एक परियोजना के लिए वसंत के तहत कार्यान्वित किया था जिसे मैं कैश में लोड जानकारी मांगने के लिए काम कर रहा था, अगर कैश था तो डेटाबेस से इसे लोड करने के लिए प्रयास किया गया था। मैं विशेष रूप से याद नहीं कर सकता कि मैंने इस पर क्या किया और मुझे लगता है कि दुर्भाग्यवश दुर्भाग्य से लापता कुंजी का अनुरोध करने वाले प्रत्येक पास के लिए डेटाबेस में अनुरोध किया जा रहा है।

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