2016-11-01 8 views
6

मैं एफई 6.1.0एफई DBContext कनेक्शन

मैं DBEntites

public partial class DbEntities : DbContext 
{ 
    public DbEntities() 
     : base("name=DbEntities") 
    { 
     ////Configuration.LazyLoadingEnabled = true; 
     ////Configuration.ProxyCreationEnabled = false; 
    } 

    //// I have ALL Entites added as below 
    ////public virtual IDbSet<CCode> CCodes { get; set; } 
} 

मैं संदर्भ वस्तु पर नीचे ऑपरेशन के रूप में कस्टम DBContex वस्तु नीचे है उपयोग कर रहा हूँ बंद करने नहीं निपटाने

using (var context = new DbEntities()) 
     { 
      var entitySet = context.Set<T>(); 
      var res = entitySet.Where<T>(predicate).ToList(); 
      if (context.Database.Connection.State == ConnectionState.Open) 
      { 
       context.Database.Connection.Close(); 
      } 

      return res; 
     } 

लेकिन संदर्भ ऑब्जेक्ट का निपटान करने के बाद भी मैं एक सक्रिय डीबी कनेक्शन देख सकता हूं। कनेक्शन स्थिति की स्थिति पर मैं देख सकता हूं कि कनेक्शन पहले ही बंद है (कनेक्शन कभी सच नहीं था)।

मैं SQL पर कनेक्शन देखने के लिए नीचे दी गई क्वेरी का उपयोग कर रहा हूं।

select db_name(dbid) , count(*) 'connections count' 
from master..sysprocesses 
where spid > 50 and spid != @@spid 
group by db_name(dbid) 
order by count(*) desc 

नीचे दिए गए कथन पर एक एसक्यूएल कनेक्शन गिनती बढ़ी। लेकिन यह निपटान के बाद भी कभी नीचे नहीं था। (मेरा मतलब है कि अवरुद्ध ब्लॉक का उपयोग करने के बाद कनेक्शन बंद करना चाहिए)।

var res = entitySet.Where<T>(predicate).ToList(); 

किसी भी मदद की सराहना की जाएगी।

+3

कनेक्शन पूलिंग की वजह से सबसे अधिक संभावना है: कनेक्शन खोलना और बंद करना महंगा है, इसलिए .NET में कुछ कनेक्शन हैं और उनका पुन: उपयोग होता है। https://msdn.microsoft.com/en-us/library/8xx3tyca(v=vs.110).aspx – Evk

+0

मुझे उम्मीद है। लेकिन मेरे मामले में मैं एक ही कनेक्शन ऑब्जेक्ट का पुन: उपयोग नहीं कर रहा हूं। इसलिए मैं अपने लिए उपयोगी नहीं होगा। –

+3

यह कनेक्शन _object_ का पुन: उपयोग करने के बारे में नहीं है। जब आप एक ही कॉन्फ़िगरेशन (कनेक्शन स्ट्रिंग) के साथ नया कनेक्शन बनाते हैं, तो यह वास्तव में डेटाबेस से नया कनेक्शन नहीं खुलता है, लेकिन मौजूदा एक का पुन: उपयोग करें (यदि पूल में कोई है)। जब आप कनेक्शन ऑब्जेक्ट बंद करते हैं तो वही होता है - अंतर्निहित कनेक्शन बंद नहीं किया जा सकता है बल्कि इसके बजाय पूल में डाल दिया जाता है। चूंकि आप सबसे अधिक संभावना अपने डेटाबेस के जीवनकाल के माध्यम से एक ही डेटाबेस से अधिक बार पूछेंगे - यह आपके लिए उपयोगी होगा। – Evk

उत्तर

8

जैसा टिप्पणियों में पाया गया था, कारण वास्तव में .NET द्वारा किए गए कनेक्शन पूलिंग का कारण है। .NET आपके अनुप्रयोग में उपयोग किए जाने वाले प्रत्येक कनेक्शन स्ट्रिंग के लिए कनेक्शन के पूल को बनाए रखता है, क्योंकि परफॉर्मेंस कारणों से (क्योंकि खोलने और बंद कनेक्शन अक्सर परफॉर्मेंस के मामले में महंगा हो सकते हैं)। उस पूल में न्यूनतम न्यूनतम और अधिकतम आकार है (MinPoolSize और MaxPoolSize कनेक्शन स्ट्रिंग पैरामीटर द्वारा नियंत्रित)। जब आप कनेक्शन खोलते हैं (SqlConnection.Open के माध्यम से) - इसे पूल से बाहर ले जाया जा सकता है और वास्तव में फिर से खोला नहीं जाता है। जब आप कनेक्शन बंद करते हैं (जो ईएफ संदर्भ का निपटारा करके भी किया जाता है) - कनेक्शन को पूल में रखा जा सकता है, और वास्तव में बंद नहीं किया जा सकता है। जब कनेक्शन कुछ समय के लिए निष्क्रिय होता है (लगभग 5 मिनट) - इसे पूल से हटाया जा सकता है।

आप (किसी कारण से) कि बचना चाहते हैं, तो आप या तो MaxPoolSize 0 करने के लिए अपने कनेक्शन स्ट्रिंग, या स्पष्ट पूल के लिए SqlConnection.ClearPool या SqlConnection.ClearAllPools द्वारा स्पष्ट रूप से सेट कर सकते हैं।

+0

बेहद उपयोगी जानकारी! –

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