दिलचस्प पोस्ट
माउस कर्सर को सी # का उपयोग कैसे करें? जोड़ () के बीच का अंतर, (), और addToBackStack को बदलें () अग्रभूमि (स्टैक के ऊपर) को कैसे गतिविधि लाया जाए? मैक्रो वैल्यू का स्ट्रिंगफिकेशन क्या हमेशा नर्वचर (मैक्स) का उपयोग करने के लिए कोई नुकसान? निजी कंस्ट्रक्टर को कैसे परीक्षण कवरेज जोड़ने के लिए? HttpContext का उपयोग करना। WebApi में मौजूद है क्योंकि async के खतरनाक है कोड में UIButton के लिए एक छवि सेट करना सी # सूचीदृश्य कॉलम चौड़ाई ऑटो सी ++ का सबसे सफ़ेद पर्स फिर से कैसे एक div करने के लिए एक टूलटिप जोड़ने के लिए MySQL में कार्डिनलता क्या है? MySQL: @ वैरिएबल बनाम चर क्या फर्क पड़ता है? एसएफटीपी के माध्यम से किसी सर्वर से फाइल कैसे प्राप्त करें? निर्भरता के साथ मेवेन 2 विधानसभा: "प्रणाली" के तहत जार शामिल नहीं है

इकाई फ़्रेमवर्क और कनेक्शन पूलिंग

मैंने हाल ही में अपने .NET 4.0 अनुप्रयोग में इकाई फ़्रेमवर्क 4.0 का उपयोग करना शुरू कर दिया है और पूलिंग से संबंधित कुछ चीजों के बारे में उत्सुक हूं।

  1. कनेक्शन पूलिंग मुझे पता है कि एडीओ। नेट डाटा प्रदाता द्वारा प्रबंधित किया जाता है, मेरे मामले में एमएस एसक्यूएल सर्वर का क्या यह तब लागू होता है जब आप एक नई संस्थाओं के संदर्भ ( ObjectContext ) को प्रारंभ करते हैं, यानी पैरामीटर रहित new MyDatabaseModelEntities() ObjectContext new MyDatabaseModelEntities() ?

  2. ए) एक वैश्विक संस्थाओं के आवेदन के संदर्भ (यानी एक स्थैतिक आवृत्ति) बनाने के फायदे और नुकसान क्या हैं या ख) एक ब्लॉक ब्लॉक के साथ, प्रत्येक दिए गए ऑपरेशन / विधि के लिए संस्थाओं के संदर्भ को उजागर और उजागर करना।

  3. किसी भी अन्य सिफारिशों, सर्वोत्तम अभ्यास, या कुछ परिदृश्यों के लिए आम दृष्टिकोण जिनके बारे में मुझे पता होना चाहिए?

वेब के समाधान से एकत्रित समाधान "इकाई फ़्रेमवर्क और कनेक्शन पूलिंग"

  1. कनेक्शन पूलिंग को किसी अन्य एडीओ। नेट अनुप्रयोग के रूप में संभाला जाता है। इकाई कनेक्शन अभी भी पारंपरिक कनेक्शन स्ट्रिंग के साथ पारंपरिक डेटाबेस कनेक्शन का उपयोग करता है। मेरा मानना ​​है कि आप कनेक्शन स्ट्रिंग में कनेक्शन पूलिंग को बंद कर सकते हैं यदि आप इसका उपयोग नहीं करना चाहते हैं ( SQL सर्वर कनेक्शन पूलिंग (एडीओ। नेट) के बारे में अधिक पढ़ें)
  2. कभी भी वैश्विक संदर्भ का उपयोग न करें ObjectContext आंतरिक पहचान मानचित्र और कार्य की इकाई सहित कई पैटर्न लागू करता है। वैश्विक संदर्भ का उपयोग करने का प्रभाव प्रति अनुप्रयोग प्रकार भिन्न है।
  3. वेब अनुप्रयोगों के लिए प्रति अनुरोध एकल संदर्भ का उपयोग करें वेब सेवाओं के लिए एकल संदर्भ प्रति कॉल का उपयोग करें WinForms या WPF अनुप्रयोग में प्रति प्रपत्र या प्रस्तोता के प्रति एकल संदर्भ का उपयोग करें। कुछ विशेष आवश्यकताएं हो सकती हैं जो इस दृष्टिकोण का उपयोग करने की अनुमति नहीं देंगे लेकिन ज्यादातर स्थिति में यह पर्याप्त है

यदि आप जानना चाहते हैं कि WPF / WinForm एप्लिकेशन के लिए एकल ऑब्जेक्ट प्रसंग का क्या प्रभाव है, तो यह आलेख देखें । यह NHibernate सत्र के बारे में है, लेकिन विचार एक ही है।

संपादित करें:

जब आप ईएफ का इस्तेमाल करते हैं, तो डिफ़ॉल्ट रूप से प्रत्येक इकाई प्रति संदर्भ केवल एक बार लोड होती है। पहली क्वेरी इकाई instace बनाता है और इसे आंतरिक रूप से संग्रहीत करता है किसी भी बाद की क्वेरी जिसमें एक ही कुंजी के साथ इकाई की आवश्यकता होती है, वह यह संग्रहीत उदाहरण देता है यदि डेटा स्टोर में मान परिवर्तित हो जाते हैं, तो आपको प्रारंभिक क्वेरी से मूल्यों के साथ इकाई प्राप्त होती है। इसे पहचान नक्शा पैटर्न कहा जाता है आप इकाई पुन: लोड करने के लिए ऑब्जेक्ट प्रसंग को बल दे सकते हैं लेकिन यह एक एकल साझा आवृत्ति को पुनः लोड कर देगा।

इकाई पर किए गए कोई भी परिवर्तन तब तक कायम नहीं रहे जब तक आप संदर्भ पर SaveChanges कॉल SaveChanges करते। आप कई संस्थाओं में परिवर्तन कर सकते हैं और उन्हें एक बार में जमा कर सकते हैं। इसे कार्य पैटर्न की इकाई कहा जाता है आप चुनिंदा नहीं कह सकते हैं कि आप किस संगत इकाई को सहेजना चाहते हैं

इन दो नमूनों को मिलाएं और आप कुछ रोचक प्रभाव देखेंगे। आपके पास संपूर्ण एप्लिकेशन के लिए इकाई का केवल एक उदाहरण है। इकाई में कोई बदलाव पूरे आवेदन को प्रभावित करता है, भले ही बदलाव अभी तक जारी नहीं हो (Committed)। सबसे अधिक बार यह ऐसा नहीं है जो आप चाहते हैं। मान लीजिए कि आपके पास WPF अनुप्रयोग में कोई संपादन प्रपत्र है। आप इकाई के साथ काम कर रहे हैं और आप जटिल संपादन (मूल्यों को बदलने, संबंधित संस्थाओं को जोड़ने, अन्य संबंधित संस्थाओं को हटाने आदि) को रद्द करने का निर्णय लेते हैं। लेकिन इकाई साझा संदर्भ में पहले ही संशोधित हुई है। आप क्या करेंगे? संकेत: ऑब्जेक्टटॉन्टेक्स्ट पर किसी भी रद्द करने वाले परिवर्तन या पूर्ववत् परिवर्तन के बारे में मुझे नहीं पता है।

मुझे लगता है कि हमें सर्वर परिदृश्य पर चर्चा करने की ज़रूरत नहीं है कई HTTP अनुरोधों या वेब सेवा कॉलों के बीच बस एक इकाई साझा करने से आपका एप्लिकेशन बेकार हो जाता है किसी भी अनुरोध को केवल बचत SaveChanges ट्रिगर कर सकते हैं और आंशिक डेटा किसी अन्य अनुरोध से बचा सकते हैं क्योंकि आप उन सभी के बीच काम की एकल इकाई साझा कर रहे हैं। इसके लिए एक और समस्या भी होगी- संदर्भ और संदर्भ में किसी भी प्रकार की संस्थाओं या संदर्भ के द्वारा उपयोग किए जाने वाले डेटाबेस कनेक्शन के साथ कोई भी हेरफेर धागा सुरक्षित नहीं है

यहां तक ​​कि एक पठनीय आवेदन के लिए भी एक वैश्विक संदर्भ एक अच्छा विकल्प नहीं है क्योंकि आप शायद हर बार एप्लिकेशन से पूछते हुए ताजा डेटा चाहते हैं।

डैनियल सीमन्स के अनुसार:

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

यह उनके व्यापक लेख से है:

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

मेरा मानना ​​है कि यह सलाह HTTP अनुरोधों तक फैली है, इसलिए एएसपी.नेट के लिए मान्य होगा। एक राज्यपूर्ण, वसा-क्लाइंट अनुप्रयोग जैसे कि "साझा" संदर्भ के लिए केवल एक WPF अनुप्रयोग हो सकता है

ईएफ 6 (4,5 भी) के दस्तावेज के साथ: https://msdn.microsoft.com/en-us/data/hh949853#9

9.3 संदर्भ प्रति अनुरोध

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

नीचे दिए गए कोड ने मेरे ऑब्जेक्ट को ताज़ा डेटाबेस मूल्यों के साथ ताज़ा करने में मदद की। प्रविष्टि (वस्तु)। पुनः लोड () कमांड ऑब्जेक्ट को डेटाबेस मूल्यों को याद करने के लिए मजबूर करता है

 GM_MEMBERS member = DatabaseObjectContext.GM_MEMBERS.FirstOrDefault(p => p.Username == username && p.ApplicationName == this.ApplicationName); DatabaseObjectContext.Entry(member).Reload();