2012-10-14 8 views
6

मेरे पास एक Google guava कैश है जो डेटाबेस से डेटा लोड कर रहा है और प्राथमिक कुंजी का उपयोग कर इसे कैशिंग कर रहा है। डेटाबेस से बनाते हुए ऑब्जेक्ट्स अपरिवर्तनीय हैं और किसी ऑब्जेक्ट को बनाने के लिए कई तालिकाओं तक पहुंच की आवश्यकता होती है। क्या इस परिदृश्य में क्या होता है:Google Guava LoadingCache क्या करता है जब लोड निष्पादित होने पर अमान्य करने के लिए कॉल किया जाता है?

  • थ्रेड 1: cache.load (10) कॉल करता है और कैश मूल्य 10
  • धागा 2 के साथ एक डेटाबेस प्राथमिक कुंजी के आधार पर डाला जा रहा है: प्राथमिक साथ डेटाबेस पंक्ति को अद्यतन करता कुंजी 10 और इसलिए यह cache.invalidate (10) को cache.load (10) समाप्त होने से पहले अमान्य कहा जाता है।

लोड (x) निष्पादित होने पर अमान्य (x) को बुलाए जाने पर गुवा लोडिंग कैश क्या करता है?

+1

यह [गलत चीज़] (https://github.com/google/guava/issues/1881) करता है। – dnault

उत्तर

3

तुम वहाँ दो स्थितियों हो सकता है:

  • थ्रेड 1 वास्तविक लोड हो रहा है (13.0.1 में LocalCache.Segment.lockedGetOrLoad()) पहले के बिंदु पर पहुंच गया, और खंड ताला acquired था: उस मामले में, लोड हो रहा है खत्म , लॉक released है और गणना मूल्य कॉलर को वापस कर दिया गया है, लेकिन यह थ्रेड 2 द्वारा अमान्य हो जाएगा जब यह चलता है (LocalCache.Segment.remove()) और acquire लॉक कर सकता है।

  • थ्रेड 2 ने वास्तव में लोडिंग शुरू करने से पहले ताला हासिल किया: अमान्यता वास्तव में कुछ भी नहीं करती है, क्योंकि प्रविष्टि अभी तक नहीं है, और थ्रेड 1 फिर अद्यतित मूल्य लोड करता है।

6

वर्तमान में the Javadoc में निर्दिष्ट है "इस कैश से जुड़े कोई भी देखने योग्य स्थिति पूर्ण होने तक संशोधित नहीं है"। लोडिंग के अर्थशास्त्र को आगे निर्दिष्ट किया गया है "लोड होने के बाद Cache.asMap().putIfAbsent का उपयोग करके कैश में नए लोड किए गए मान जोड़े गए हैं।"

आप the code भी पढ़ सकते हैं यह देखने के लिए कि अमान्य या निकालने के दौरान लोडिंग प्रविष्टियों को अनदेखा किया जाता है।

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