2015-06-19 13 views
6

एक ऐसे एप्लिकेशन में जो मैंने विरासत में प्राप्त किया है, वहां बेस नियंत्रक में यह है कि एप्लिकेशन में हर दूसरे नियंत्रक से विरासत प्राप्त होती है।डीबीकॉन्टेक्स्ट और कनेक्शन पूल

public BaseController() 
    { 
     db = new MyDbContext(); 

     db.Database.Log = s => Debug.Write(s); 
    } 

public MyDbContext() 
     : base("name=MyDbContext") 
    { 
     // hack to force Visual Studio to deploy the Entityframework.SqlServer package 
     var instance = SqlProviderServices.Instance; 
    } 

आवेदन के तरीके के कारण, प्रति अनुरोध कम से कम 2 संदर्भ बनाए जाते हैं। (यह एक एमवीसी एप्लीकेशन है और प्रत्येक पृष्ठ पर होम कंट्रोलर के लिए एक कॉल है और किसी भी अन्य नियंत्रक को किसी विशेष पृष्ठ के लिए बुलाया जाता है।)

मेरा प्रश्न यह है कि DbContext SQL सर्वर से कनेक्शन कब बनाता है? क्या यह तुरंत होता है जब संदर्भ बनाया जाता है, या केवल तभी जब कोई क्वेरी निष्पादित की जाती है?

यदि यह पूर्व है, तो मैं आवश्यकतानुसार SQL सर्वर से कनेक्शन की संख्या से दो बार उपयोग कर रहा हूं, और यदि यह बाद वाला है तो शायद यह कोई समस्या नहीं है।

मुझे नहीं लगता कि मैं इसे तत्काल भविष्य में दोबारा कर सकता हूं, निश्चित रूप से औचित्य के बिना नहीं। मुझे इस डिजाइन के संभावित नुकसान के बारे में पता होना चाहिए?

इकाई की रूपरेखा 6.1.3

+0

इस एफई का कौन सा संस्करण है?और क्या आप हमें 'MyDbContext' के कन्स्ट्रक्टर दिखा सकते हैं? इससे आपके प्रश्न का उत्तर देने के लिए आवश्यक विवरण दिए जाएंगे। – sstan

+0

प्रश्न अद्यतन किया गया – MrBliz

उत्तर

3

क्योंकि आप अपने संदर्भ के निर्माता में स्वयं को कनेक्शन बनाने और पास करने का प्रयास नहीं कर रहे हैं, तो, हाँ, जैसा कि अन्य कह रहे हैं, ईएफ एक कनेक्शन पूल से कनेक्शन प्राप्त/रिलीज करेगा, जब इसे बनाया जाए।

सूचना एफई प्रलेखन से बोली:

कनेक्शन

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

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

अधिक जानकारी के लिए निम्न लिंक देखें:

https://msdn.microsoft.com/en-us/data/jj729737

https://msdn.microsoft.com/en-us/data/dn456849

1

कनेक्शन खोला जाता है केवल जब एक प्रश्न निष्पादित किया जाता है। कनेक्शन पूल एडीओ.NET कक्षाओं (एसक्यूएलकनेक्शन) द्वारा प्रबंधित किया जाता है। प्रति अनुरोध एकाधिक DbContext उदाहरण होने के ठीक है और कभी-कभी आवश्यक है। आपके पास सामान्य रूप से दो बार कनेक्शन नहीं होंगे।

3

इकाई फ्रेमवर्क खुले देर से और निकट प्रारंभिक सिद्धांत का पालन करता है। इसलिए, यह केवल तब भी कनेक्शन खोलता है जब इसकी आवश्यकता होती है, आईई एक क्वेरी को पूरा करने के लिए, फिर इसे जितनी जल्दी हो सके इसे बंद कर देता है।

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

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