2014-05-19 15 views
6

मैं वेबएपी और AngularJS का उपयोग कर किसी एप्लिकेशन पर काम कर रहा हूं। आवेदन के लिए कुछ समय बिताने के बाद मुझे यह अपवाद मिल रहा है। मैं इस ऐप में EntityFramework का उपयोग कर रहा हूं।टाइमआउट समाप्त हो गया। पूल से कनेक्शन प्राप्त करने से पहले टाइमआउट अवधि समाप्त हो गई।

"Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached."

स्टैक ट्रेस

at System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection) 
↵ at System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions) 
at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry) 
at System.Data.SqlClient.SqlConnection.Open() 
at System.Data.EntityClient.EntityConnection.OpenStoreConnectionIf(Boolean openCondition, DbConnection storeConnectionToOpen, DbConnection originalConnection, String exceptionCode, String attemptedOperation, Boolean& closeStoreConnectionOnFailure) 
+2

आपके कोड के बिना, यह कहना मुश्किल है कि क्या गलत है। अगर मुझे लगता है, तो मैं कहूंगा कि आपको 'उपयोग' ब्लॉक को नियोजित करने की आवश्यकता है। – nvoigt

+0

हाँ मैं 'कथन का उपयोग' नहीं कर रहा हूं – RaviMittal

उत्तर

10

अपने डेटाबेस कनेक्शन (यह वास्तव में महत्वपूर्ण है) बंद करें।

SqlConnection myConnection = new SqlConnection(ConnectionString); 
try 
{ 
    conn.Open(); 
    someCall (myConnection); 
} 
finally 
{ 
    myConnection.Close();     
} 

या

using (SqlConnection myConnection = new SqlConnection(ConnectionString)) 
{ 
    myConnection.Open(); 
    someCall(myConnection); 
} 

चेक कितने उपयोगकर्ताओं को अपने डेटाबेस और querys के लिए समय के लिए बाहर से जुड़े हैं। यदि आपके पास क्वेरी निष्पादित करने में लंबा समय लगता है तो भी जांचें।

शायद, डुप्लिकेट प्रश्न:

How can I solve a connection pool problem between ASP.NET and SQL Server?

1

हमेशा अपने संबंध में, पूल अंत में ब्लॉक

  • आकार बढ़ाएं में अपने कनेक्शन बंद निम्नलिखित बातें

    1. करने का प्रयास करें स्ट्रिंग स्ट्रिंग कनेक्शनस्ट्रिंग = "डेटा स्रोत = लोकलहोस्ट; प्रारंभिक कैटलॉग = उत्तरी हवा;" + "एकीकृत सुरक्षा = एसएसपीआई; न्यूनतम पूल आकार = 10; अधिकतम पूल आकार = 100";

             or 
      
    2. सभी स्ट्रिंग connectionstring = पर पूलिंग का उपयोग न करें ", प्रारंभिक सूची = नॉर्थविंड; डेटा स्रोत = स्थानीय होस्ट" + "एकीकृत सुरक्षा = एसएसपीआई; पूलिंग = झूठा;";

  • 1

    मुझे बस एक ही समस्या का अनुभव हुआ।

    using (SqlConnection con = new SqlConnection(strCon)) 
    { 
        using (SqlCommand cmd = new SqlCommand(strCmdText, con)) 
        { 
         con.Open(); 
         using (SqlDataReader dr = cmd.ExecuteReader()) 
         { 
           //do stuff; 
           dr.Close(); 
         } 
        } 
        con.Close(); 
    } 
    

    यह मेरी समस्या को ठीक करने लग रहा था: मैं इस तरह एक पैटर्न जिससे समस्या का समाधान करने के लिए लग रहा था का उपयोग कर समाप्त हो गया। DataReader.Close() वह नाखून था जो उसने किया था। ऐसा लगता है कि एमएस को उनकी सिफारिश बदलनी चाहिए क्योंकि मैंने इसे अपनी साइट पर पाया है कि try { } finally { con.Close(); } पैटर्न का उपयोग न करें। मैंने इसे स्पष्ट रूप से आजमाया नहीं है, क्योंकि पैटर्न हमारी पूरी डीबी परत में काफी व्यापक है और कुछ करीब ढूंढना चाहता था।

    मुझे आशा है कि इससे किसी की मदद मिलेगी।

    0

    फोर्स कचरा कलेक्टर कॉल:

    System.GC.Collect() 
    
    +0

    यह मेरे मामले के लिए काम करता है। लेकिन मैंने एक और विकल्प पसंद किया: कनेक्शन स्ट्रिंग में कनेक्शन पूलिंग का उपयोग न करें (...; पूलिंग = झूठा; ...)। तो, मैं सिस्टम स्तर पर कचरा संग्रह छोड़ सकता था। –

    +1

    कृपया, कृपया, कृपया! जीसी को निष्पादित करने के लिए बाध्य न करें जब तक पूरी तरह से यह सुनिश्चित न हो कि यह एक अच्छा विचार है (संभावना है, वे नहीं हैं)। अधिक जानकारी के लिए कृपया [इस उत्तर] (https://stackoverflow.com/questions/233596/best-practice-for-forcing-garbage-collection-in-c-sharp) देखें। –

    0

    थोड़ा, पुराने खेद diggin इस बाहर के लिए है, लेकिन यह काम पर इस सप्ताह हमारे लिए हुआ:

    या तो के रूप में @sohail नसीर ने उत्तर दिया, अपने कनेक्शन नहीं कर रहे बंद नहीं है, या आपके पास डेटा क्लास है जो सही ढंग से उपयोग नहीं किया जाता है:

    यदि आप 105 बार लूप करते हैं, और प्रत्येक लूप में आप एक नई डेटा ऑब्जेक्ट घोषित करते हैं और आप इसके साथ डीबी से पूछते हैं, तो आप 105 कनेक्शन बनाएंगे (इस प्रकार आप अपने 100 अधिकतम अनुमत अनुमति देते हैं) भले ही आप बंद करें और ऑब्जेक्ट्स को सही तरीके से निपटें, एसक्यूएल को अभी भी उस नए कनेक्शन के कनेक्शन को फिर से सौंपने के लिए समय चाहिए।

    0

    यह SQLLonnection और SqlCommand ऑब्जेक्ट्स के आसपास उपयोग कथन का उपयोग करने का सुझाव दिया गया था।

    कृपया ध्यान दें कि यदि आपके पास SqlDataReader लूप में उपज रिटर्न के उपयोग के साथ एक आईनेमरेबल लौटने वाला फ़ंक्शन है, तो यह अनुशंसित पैटर्न नहीं है। ऐसा करने से, डेटा रीडर निष्पादित होने से पहले डेटाबेस से कनेक्शन बंद हो जाएगा।

    इसके बजाय, ExecuteReader कॉल में CommandBehavior.CloseConnection पैरामीटर लागू करें।

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

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