2011-07-05 16 views
5

मेरे पास System.Entity.Data.DbContext पर आधारित कई कक्षाएं हैं। वे वेब अनुप्रयोग के अलग-अलग सिरों में कई बार अनुरोध करते हैं - क्या उन्हें तुरंत चालू करना महंगा है?कैशिंग इकाई फ्रेमवर्क डीबी कॉन्टैक्स प्रति अनुरोध

मैं उनकी एक प्रतिलिपि HttpContext.Current.Items में कैश कर रहा था क्योंकि प्रति अनुरोध की कई प्रतियां रखने का अधिकार नहीं था, लेकिन अब मुझे पता चला है कि यह स्वचालित रूप से HttpContext से नहीं निकाला जाता है अनुरोध के अंत में। इससे पहले कि मैं इसे निपटाने के लिए कोड लिखने से पहले (Application_EndRequest में), मैंने सोचा कि मैं स्थिति को पढ़ाऊंगा क्योंकि वास्तव में उन्हें कोई संकेत नहीं दिया गया है, अगर मुझे उन्हें तुरंत चालू करना चाहिए जहां मुझे उनकी आवश्यकता है और फिर वहां उनका निपटान करें।

इस तरह के प्रश्न इंटरनेट के आसपास पूछे गए हैं, लेकिन मुझे ऐसा लगता है कि मेरे प्रश्न का उत्तर वास्तव में नहीं है। क्षमा करें अगर मैं किसी को दोहरा रहा हूं।

अद्यतन

मुझे पता चला है कि संदर्भों के निपटान शायद this ब्लॉग पोस्ट में कोई फर्क नहीं पड़ता, लेकिन मैं अभी भी सुनने के लिए वे पहली जगह में दृष्टांत के लिए महंगे हैं कि क्या दिलचस्पी रखता हूँ। असल में, क्या दृश्यों के पीछे बहुत सारे ईएफ जादू चल रहे हैं जिन्हें मैं अक्सर करना नहीं चाहता हूं?

+0

एक और एसओ उत्तर मूल रूप से मेरे प्रश्न का उत्तर देता है: [यहां] (http://stackoverflow.com/questions/813457/instantiating-a-context-in-linq-to-entities)। सृजन को तेज करने के लिए थोड़ा सा हालांकि यह [कैश] एंटीटी कनेक्शन का उपयोग [यह] (http://stackoverflow.com/questions/2575485/managing-entityconnection-lifetime) प्रश्न के अनुसार करना संभव है (हालांकि यह सहन करना उपयोगी है ध्यान रखें कि यह धागा सुरक्षित नहीं है)। मैं अभी तक अपने प्रश्न का उत्तर नहीं दे सकता, इसलिए मैं इंतजार करूंगा और देख सकता हूं कि कोई अन्य उम्मीदवार हैं या नहीं। – stewartml

+0

संभावित डुप्लिकेट [एक डीबी कॉन्टेक्स्ट प्रति वेब अनुरोध ... क्यों?] (Http://stackoverflow.com/questions/10585478/one-dbcontext-per-web-request-why) – Steven

उत्तर

4

मैं पूर्णता के लिए अपने स्वयं के प्रश्न का उत्तर दे रहा हूं।

This उत्तर इस मुद्दे के बारे में अधिक जानकारी प्रदान करता है।

संक्षेप में, डीबीकॉन्टेक्स्ट को तुरंत चालू करना महंगा नहीं है, इसलिए चिंता न करें।

इसके अलावा, आपको डेटा संदर्भों को निपटाने के बारे में चिंता करने की ज़रूरत नहीं है। आपको पता चलेगा कि स्कॉटगु अपने नमूने में नहीं है (वह आमतौर पर नियंत्रक पर एक निजी क्षेत्र के रूप में संदर्भ है)। This उत्तर में डेटा संदर्भों का निपटान करने के बारे में लिंक से SQL टीम की कुछ अच्छी जानकारी है, और this ब्लॉग पोस्ट भी इस विषय पर फैलता है।

+0

+1 अच्छे लिंक के लिए। धन्यवाद – MLH

0

हमारे पास आपके द्वारा वर्णित एक समान पैटर्न का उपयोग करके एक वेब प्रोजेक्ट है (हालांकि ईएफ के बजाय एकाधिक और स्वतंत्र एल 2 एस संदर्भों के साथ)। हालांकि अनुरोध के अंत में संदर्भ का निपटारा नहीं किया गया है, हमने पाया है कि HttpContext.Current अव्यवस्थित हो जाता है, जीसी निश्चित रूप से संदर्भ एकत्र करता है, जिससे दृश्यों के तहत निपटान होता है। हमने स्मृति विश्लेषक का उपयोग करके इसकी पुष्टि की। यद्यपि संदर्भ उस समय से थोड़ा अधिक समय तक चल रहा था, यह हमारे लिए स्वीकार्य था।

व्यवहार को ध्यान में रखते हुए हमने एंड्रॉक्वेस्ट पर संदर्भों का निपटारा करने और एंड्रॉक्वेस्ट पर जीसी कलेक्ट को मजबूर करने सहित कुछ विकल्पों की कोशिश की है (वह मेरा विचार नहीं था और जल्दी से वापस कर दिया गया था)।

अब हम कार्य के एक इकाई को कार्यान्वित करने की संभावना की जांच कर रहे हैं जिसमें अनुरोध के दौरान संदर्भों के हमारे संग्रह शामिल हैं। अगर आप इसे Google करते हैं, तो कुछ महान लेख हैं, लेकिन हमारे लिए, हां, यह लागू करने के लिए समय प्रभावी लाभ से अधिक होगा।

तरफ, मैं अब एक संयुक्त एसओए/कार्य दृष्टिकोण के यूनिट में जाने की जटिलता की जांच कर रहा हूं, लेकिन फिर, यह उन चीजों में से एक है जो ज्ञान के बिना एक उद्यम आकार के आवेदन के बाद आपको थप्पड़ मारता है ।

मैं इस विषय पर अन्य लोगों के विचार सुनने के लिए उत्सुक हूं।

+0

धन्यवाद। मैंने सोचा था कि जीसी इसे 'किसी बिंदु पर' करने के लिए भारी भार के तहत अच्छा नहीं होगा और यह निर्धारक होना बेहतर होगा, लेकिन मैं स्वीकार करने वाला पहला व्यक्ति हूं कि मुझे उस क्षेत्र के बारे में ज्यादा जानकारी नहीं है। मैं एक जीसी नहीं करूँगा। हालांकि, देखें [यह] (http://stackoverflow.com/questions/2482220/attaching-linq-to-sql-datacontext-to-httpcontext-in-business-layer/2491698# 2491698) एक बेहतर समाधान के लिए जवाब। मैं इसे लेता हूं आपको लगता है कि संदर्भों को कैशिंग करना सार्थक है? – stewartml

+0

मुझे लगता है कि एक बहुत अस्पष्ट रेखा है। बस हमारे आवेदन की संरचना के कारण, संदर्भों के लिए सिंगलटन पैटर्न के अलावा कुछ भी (एचटीपीकॉन्टेक्स्ट में संदर्भों को संग्रहीत कारखाने के रूप में लागू किया गया) हमारे लिए एक दुःस्वप्न रहा होगा - यह सुनिश्चित करना है कि प्रासंगिक संदर्भों पर इकाइयां लोड की गई हों, संदर्भों को सुनिश्चित करना स्थगित भारित गुणों का उपयोग करते समय निपटाया नहीं गया है। हमारे पास _incident_ था जिसके द्वारा हम प्रत्येक अनुरोध के दौरान आवश्यक 15 से अधिक संदर्भ उत्पन्न कर रहे थे, संभवतः संदर्भों को कैश करने के समान नहीं। परिणामस्वरूप एक महत्वपूर्ण प्रदर्शन मारा गया था। – Smudge202

+0

यहां एक दिलचस्प [पोस्ट] है (http://stephenwalther.com/blog/archive/2008/08/20/asp-net-mvc-tip-34-dispose-of-your-datacontext-or-don-t। एएसपीएक्स) मैं बस उस पर ठोकर खाई जो आपके लिए लागू हो सकती है। मुझे लगता है कि यह ईएफ संदर्भों पर भी लागू होता है - मूल रूप से, एसक्यूएल कनेक्शन सभी को बंद कर दिया जाएगा, इसलिए संदर्भ को निपटाने के बारे में चिंता न करें। – stewartml

3

HttpContext.Items का उपयोग करें और EndRequest में अपने संदर्भ को मैन्युअल रूप से निपटें - आप इसके लिए कस्टम HTTP मॉड्यूल भी बना सकते हैं। यह एक सही हैंडलिंग है। संदर्भ निपटान सभी ट्रैक की गई संस्थाओं के संदर्भ भी जारी करेगा और जीसी उन्हें एकत्रित करने की अनुमति देगा।

यदि आपको वास्तव में उनकी आवश्यकता है तो आप प्रति अनुरोध एकाधिक संदर्भ का उपयोग कर सकते हैं लेकिन अधिकांश परिदृश्यों में एक पर्याप्त है। यदि आपका सर्वर प्रोसेसिंग एक लॉजिकल ऑपरेशन है तो आपको काम की पूरी इकाई के लिए एक संदर्भ का उपयोग करना चाहिए। यह विशेष रूप से महत्वपूर्ण है यदि आप लेनदेन में और अधिक परिवर्तन करते हैं क्योंकि एकाधिक संदर्भ के साथ आपके लेनदेन को वितरित करने के लिए प्रोत्साहित किया जाएगा और इसका नकारात्मक प्रदर्शन प्रभाव होगा।

+0

धन्यवाद। मुझे "आपके लेनदेन को वितरित करने के लिए प्रोत्साहित किया जाएगा" के बारे में कुछ समझ में नहीं आता है, क्या आप कृपया स्पष्टीकरण दे सकते हैं? क्या आप संदर्भ का निपटान करने के लिए _need_ है? अद्यतन प्रश्न में उल्लिखित ब्लॉग पोस्ट अन्यथा सुझाता है, और मैंने देखा है कि स्कॉट गु अपने निजी संदर्भों का उपयोग अपने संदर्भों के लिए करता है, जिसे तब निपटान नहीं किया जाता है। – stewartml

+0

बिंदु @ लद्दीस्लाव हमारे लिए विशेष रूप से प्रासंगिक है। हम लेन-देन के क्षेत्र के साथ कई संदर्भों पर भरोसा करते हैं, जो निश्चित रूप से डीटीसी के माध्यम से लेनदेन के प्रचार का कारण बनते हैं। हालांकि, हमने अभी भी पाया है कि इकाई सेट को कुशलता से साफ किया जा रहा था ताकि संदर्भों को निपटाने के लिए मजबूर करने की आवश्यकता न हो। मैं समझता हूं कि यह _efficient_ प्रोग्रामिंग नहीं है, या _best practice_ है, लेकिन यह _just work_ करता है।एक असाधारण साइड इफेक्ट भी था जब हमने संदर्भों के निपटारे को लागू किया था कि उसी संदर्भ के स्वतंत्र उदाहरण होने के नाते, एसिंक का उपयोग करने के कारण, हमें मृत्यु हो गई ... – Smudge202

6

सर्वश्रेष्ठ शर्त यहां आईओसी कंटेनर का उपयोग जीवनशैली का प्रबंधन करने के लिए करेगी - वे बहुत अच्छे हैं और यह एक आम परिदृश्य है।क्या आपके स्टाइलशीट के लिए गतिशील आमंत्रण को आसान बनाने का अतिरिक्त लाभ डीबी संदर्भ नहीं बनाएगा क्योंकि इसे BeginRequest() में हार्डकोड किया गया है।

+0

क्या आप विशेष रूप से अनुशंसा करते हैं? – stewartml

+0

अगर मुझे कोई बाधा नहीं है, तो शायद मैं परिचितता से संरचना के साथ जाऊंगा। अधिकांश, अगर नहीं, तो "नाम" कंटेनरों में से यह सुविधा है। स्ट्रक्चर मैप के लिए –

+0

+1 (अच्छे के लिए हमारे लिए अच्छा काम करता है) – RPM1984

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