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




database entity-framework (3)

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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


डैनियल सिमन्स के मुताबिक:

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

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

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

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





connection-pooling