2009-04-16 15 views
20

अतीत में मैंने HttpRuntime.Cache तंत्र तक पहुंचने के लिए एक ताला लगा दिया है। मुझे यकीन नहीं है कि मैंने वास्तव में अतीत में इस मुद्दे पर शोध किया था और अंधेरे ने इसे लॉक से घिराया था।HttpRuntime.Cache सर्वोत्तम प्रथाओं

क्या आपको लगता है कि यह वास्तव में आवश्यक है?

+0

http://stackoverflow.com/questions/447705/locking-httpruntime-cache-for-lazy-loading लगता है कि कैश थ्रेड सुरक्षित –

+0

भाषा/प्लेटफ़ॉर्म है? – Javier

उत्तर

2

मुझे नहीं लगता कि एचटीपीआरटाइम तक पहुंच लपेटना जरूरी है। लॉक के साथ संपत्ति को कैश करें, क्योंकि कैश प्रॉपर्टी स्थिर है और थ्रेड-सुरक्षित भी है।

कैश ऑब्जेक्ट (HttpRuntime.Cache, HttpContext.Current.Cache, Page.Cache आदि) तक पहुंचने के कई अलग-अलग तरीके हैं। वे सभी एक ही कैश ऑब्जेक्ट तक पहुंचते हैं, क्योंकि प्रति एप्लिकेशन डोमेन में केवल एक कैश ऑब्जेक्ट है, क्योंकि यह प्रभावी रूप से थ्रेड-सुरक्षित सिंगलटन ऑब्जेक्ट है।

10

इस लेख से पता चलता है एक ताला इस्तेमाल किया जाना चाहिए:

http://msdn.microsoft.com/en-us/magazine/cc500561.aspx

उद्धरण:

समस्या यह है कि आप कर रहे हैं अगर आप एक क्वेरी कि 30 सेकंड लेता है मिल गया है और है में हर दूसरे पृष्ठ को निष्पादित करने के लिए कैश आइटम को पॉप्युलेट करने में लगने वाला समय, 2 9 अन्य अनुरोध आएंगे, जिनमें से सभी प्रयास करेंगे डेटाबेस पर अपने क्वेरी के साथ कैश आइटम को पॉप्युलेट करें। इस समस्या को हल करने के लिए, आप पर थ्रेड लॉक जोड़ सकते हैं डेटाबेस से डेटा का अनुरोध करने वाले अन्य पृष्ठ निष्पादन को रोकें।

यहाँ अपने कोड का टुकड़ा है:

// check for cached results 
object cachedResults = ctx.Cache["PersonList"]; 
ArrayList results = new ArrayList(); 

if (cachedResults == null) 
{ 
    // lock this section of the code 
    // while we populate the list 
    lock(lockObject) 
    { 
    cachedResults = ctx.Cache["PersonList"]; 
    // only populate if list was not populated by 
    // another thread while this thread was waiting 
    if (cachedResults == null) 
    { 
     cachedResults = ... 
     ctx.Cache["PersonList"] = cachedResults; 
    } 
    } 
} 

मैं इस कोड का परीक्षण नहीं किया है, लेकिन मैं बहुत कोई है जो उत्पादन परिवेश में इस दृष्टिकोण का मूल्यांकन किया गया है सुनने के लिए दिलचस्पी होगी।

+11

मुझे नहीं लगता कि यह कैशिंग थ्रेड-सुरक्षा के मामले में आवश्यक है - संभावित रूप से महंगा क्वेरी चलाने के लिए डेटाबेस में एकाधिक पहुंच को रोकने के लिए यह और अधिक है। – zcrar70

+1

मैं आपसे सहमत हूं। – frankadelic

+5

उदाहरण में बस एक छोटा लेकिन महत्वपूर्ण गॉचा: लॉक (लॉकऑब्जेक्ट) और यदि (कैश्ड रीसेट्स == नल) के बीच, कैश किए गए आइटम को फिर से पुनर्प्राप्त किया जाना चाहिए। यह http: // stackoverflow देखें।कॉम/प्रश्न/39112/एक उचित उदाहरण के लिए सबसे अच्छा-रास्ता-टू-लॉक-कैश-इन-एएसपी-नेट क्या है। –

2

मुझे नहीं लगता कि लॉकिंग नीचे दिए गए मुद्दे का उत्तर है, खासकर उत्पादन वातावरण में, जहां आपके पास कई एप्लिकेशन आपके एप्लिकेशन चला रहे हैं।

समस्या यह है कि यदि आपके पास कोई प्रश्न है जो 30 सेकंड लेता है और आप हर दूसरे पृष्ठ को निष्पादित कर रहे हैं, तो कैश आइटम को पॉप्युलेट करने में समय लगता है, 2 9 अन्य अनुरोध आएंगे, जिनमें से सभी डेटाबेस में अपने प्रश्नों के साथ कैश आइटम को पॉप्युलेट करने का प्रयास करेगा। इस समस्या को हल करने के लिए, आप डेटाबेस से डेटा का अनुरोध करने से अन्य पेज निष्पादन को रोकने के लिए थ्रेड लॉक जोड़ सकते हैं।

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