2014-11-17 11 views
5

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

यहां एप्लिकेशन का एक संक्षिप्त अवलोकन है। आवेदन 3 सर्वरों में रहता है; एक वेब सर्वर, एक ऐप सर्वर और एक डीबी सर्वर SQL Server 2008 चला रहा है। सभी सर्वर Windows Server 2008 पर चल रहे हैं। वेब सर्वर सार्वजनिक डोमेन में रहता है। ऐप सर्वर डीएमजेड में रहता है जिसमें डब्ल्यूसीएफ के माध्यम से पोर्ट 80 और 443 पर वेब सर्वर के बीच खुले संचार के साथ रहता है। डीबी सर्वर पोर्ट 1433 पर ऐप सर्वर के लिए खुले संचार के साथ एक निजी डोमेन में रहता है। आवेदन अब कुछ समय के लिए उत्पादन में रहा है और केवल पिछले हफ्ते तक इन मुद्दों का सामना कर रहा है। कोई कोड परिवर्तन नहीं था और होस्टिंग प्रदाता का कहना है कि हाल ही में किए गए सर्वर में कोई बदलाव नहीं आया है।

वेब सर्वर पर, एप्लिकेशन नीचे पोस्ट की गई त्रुटि का अनुभव करता है (त्रुटि 1)। त्वरित समाधान समाधान ऐप सर्वर आईआईएस प्रक्रिया को पुनरारंभ करना है, हालांकि, यह अब एक पुन: संक्रमित समस्या है और व्यापार मालिकों को प्रमुख बाधा उत्पन्न कर रहा है।

एप्लिकेशन का डीएएल डेटाबेस से कनेक्शन खोलने के लिए एंटरप्राइज़ लाइब्रेरी v4.1 का उपयोग करता है। मैंने कोड के 2 स्निपेट शामिल किए हैं जो कॉल (कोड 1 और कोड 2) शुरू करने के लिए ज़िम्मेदार हैं। इस विधि को कई अन्य तरीकों से दोहराया जाता है। क्या यह संभव है कि ExecuteReader विधि कनेक्शन को ठीक से बंद नहीं कर रहा है? विधि का कोई ओवरराइड नहीं है जो कनेक्शन को बंद करने के लिए कनेक्शन कनेक्शन निर्दिष्ट करने की अनुमति देता है।

हमने एक एसक्यूएल प्रोफाइल विश्लेषण किया और निर्धारित किया कि डीबी के लिए कोई लंबा खुला कनेक्शन नहीं है।

समस्या का शोध करते समय, किसी ने सुझाव दिया कि एंटरप्राइज़ लाइब्रेरी में एक बग हो सकती है जहां कनेक्शन ठीक से निपटान नहीं किए जाते हैं, हालांकि यह पोस्ट पर सत्यापित नहीं किया गया था। मैं समस्या का कारण कैसे निर्धारित कर सकता हूं? या समस्या का समाधान करने के लिए कार्रवाई का उचित तरीका क्या होगा? मैं पूल आकार बढ़ा सकता हूं, हालांकि ऐसा लगता है कि यह एक अस्थायी समाधान होगा।

त्रुटि 1:

***System.ServiceModel.FaultException: 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.GetConnection(DbConnection owningConnection) at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) at System.Data.SqlClient.SqlConnection.Open() at Microsoft.Practices.EnterpriseLibrary.Data.Database.GetNewOpenConnection() at Microsoft.Practices.EnterpriseLibrary.Data.Database.GetOpenConnection(Boolean disposeInnerConnection) at Microsoft.Practices.EnterpriseLibrary.Data.Database.ExecuteReader(DbCommand command) at Microsoft.Practices.EnterpriseLibrary.Data.Database.ExecuteReader(String storedProcedureName, Object[] parameterValues) at CityStoreDAL.NavigationProvider.GetNavigator(Int32 navigatorID) in c:\TFS\CityStore\DEV\SRC\CityStoreDAL\NavigationProvider.cs:line 41 at CityStoreBLL.Navigation.GetNavigator(Int32 navigatorID) in c:\TFS\CityStore\DEV\SRC\CityStoreBLL\Navigation.cs:line 15 at CityStoreService.CityStoreService.GetNavigator(Int32 navigato rID) in c:\TFS\CityStore\DEV\SRC\CityStoreService\Navigation.cs:line 21 at SyncInvokeGetNavigator(Object , Object[] , Object[]) at System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs) at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc) at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc) at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)*** 
Generated: Wed, 12 Nov 2014 19:40:22 GMT 

System.Web.HttpUnhandledException: Exception of type 'System.Web.HttpUnhandledException' was thrown. ---> System.ServiceModel.FaultException: 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.GetConnection(DbConnection owningConnection) 
    at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) 
    at System.Data.SqlClient.SqlConnection.Open() 
    at Microsoft.Practices.EnterpriseLibrary.Data.Database.GetNewOpenConnection() 
    at Microsoft.Practices.EnterpriseLibrary.Data.Database.GetOpenConnection(Boolean disposeInnerConnection) 
    at Microsoft.Practices.EnterpriseLibrary.Data.Database.ExecuteReader(DbCommand command) 
    at Microsoft.Practices.EnterpriseLibrary.Data.Database.ExecuteReader(String storedProcedureName, Object[] parameterValues) 
    at CityStoreDAL.NavigationProvider.GetNavigator(Int32 navigatorID) in c:\TFS\CityStore\DEV\SRC\CityStoreDAL\NavigationProvider.cs:line 41 
    at CityStoreBLL.Navigation.GetNavigator(Int32 navigatorID) in c:\TFS\CityStore\DEV\SRC\CityStoreBLL\Navigation.cs:line 15 
    at CityStoreService.CityStoreService.GetNavigator(Int32 navigatorID) in c:\TFS\CityStore\DEV\SRC\CityStoreService\Navigation.cs:line 21 
    at SyncInvokeGetNavigator(Object , Object[] , Object[]) 
    at System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs) 
    at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc) 
    at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc) 
    at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet) 

Server stack trace: 
    at System.ServiceModel.Channels.ServiceChannel.HandleReply(ProxyOperationRuntime operation, ProxyRpc& rpc) 
    at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout) 
    at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation) 
    at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message) 

Exception rethrown at [0]: 
    at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg) 
    at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type) 
    at CityStoreWeb.CityStoreServiceReference.INavigation.GetNavigator(Int32 navigatorID) 
    at CityStoreWeb.Product.<>c__DisplayClass1.<BindCategoryMenuAndInfo>b__0(INavigation proxy) in c:\TFS\CityStore\DEV\SRC\CityStoreWeb\Product.aspx.cs:line 73 
    at CityStoreWeb.Common.Service'1.Use(UseServiceDelegate'1 codeBlock) in c:\TFS\CityStore\DEV\SRC\CityStoreWeb\Common\Utils.cs:line 243 
    at CityStoreWeb.Product.BindCategoryMenuAndInfo(Int32 navigatorID) in c:\TFS\CityStore\DEV\SRC\CityStoreWeb\Product.aspx.cs:line 71 
    at CityStoreWeb.Product.SetupPage(Int32 navigatorID, Int32 categoryID, Int32 productID) in c:\TFS\CityStore\DEV\SRC\CityStoreWeb\Product.aspx.cs:line 64 
    at CityStoreWeb.Product.Page_Load(Object sender, EventArgs e) in c:\TFS\CityStore\DEV\SRC\CityStoreWeb\Product.aspx.cs:line 37 
    at System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) 
    at System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) 
    at System.Web.UI.Control.OnLoad(EventArgs e) 
    at CityStoreWeb.Common.BasePage.OnLoad(EventArgs e) in c:\TFS\CityStore\DEV\SRC\CityStoreWeb\Common\BasePage.cs:line 26 
    at System.Web.UI.Control.LoadRecursive() 
    at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) 
    --- End of inner exception stack trace --- 
    at System.Web.UI.Page.HandleError(Exception e) 
    at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) 
    at System.Web.UI.Page.ProcessRequest(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) 
    at System.Web.UI.Page.ProcessRequest() 
    at System.Web.UI.Page.ProcessRequest(HttpContext context) 
    at ASP.product_aspx.ProcessRequest(HttpContext context) 
    at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 
    at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) 

कोड 1:

public static NavigatorEntity GetNavigator(int navigatorID) 
{ 
     Database db = DatabaseFactory.CreateDatabase(); 
     object[] spParams; 
     spParams = new object[1]; 
     spParams[0] = navigatorID; 
     using (IDataReader reader = db.ExecuteReader("GetNavigator", spParams)) 
     { 
      if (reader == null)k 
      { 
       throw new ArgumentNullException("reader"); 
      } 
      NavigatorEntity myNav = null; 
      if (reader.Read()) 
      { 
       myNav = GetNavigatorEntityFromReader(reader); 
      } 

      if (myNav != null) 
      { 
       reader.NextResult(); 
       myNav.Categories = GetCategoriesCollectionFromReader(reader); 

       reader.NextResult(); 
       myNav.RecommendedProducts = 
        ProductProvider.GetRecommendedProductCollectionFromReader(reader, false); 
      } 

      return myNav; 
     } 
    } 

कोड 2:

public static List<NavigatorEntity> GetNavigatorsAll() 
{ 
    Database db = DatabaseFactory.CreateDatabase(); 

    using (IDataReader myReader = db.ExecuteReader("GetNavigatorsAll")) 
    { 
     return GetNavigatorCollectionFromReader(myReader); 
    } 
} 

private static List<NavigatorEntity> GetNavigatorCollectionFromReader(IDataReader reader) 
{ 
    List<NavigatorEntity> navigators = new List<NavigatorEntity>(); 
    while (reader.Read()) 
    { 
     navigators.Add(GetNavigatorEntityFromReader(reader)); 
    } 
    return navigators; 
} 

अद्यतन:

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

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

फिक्स उचित उपयोग में उचित तरीके से रूज विधियों को लपेटना था।

तरीकों समस्या खड़ी कर रहा से एक:

public static List<TaxCodeEntity> CMSGetTaxCodes() 
{ 
    Database db = DatabaseFactory.CreateDatabase(); 
    return GetTaxCodeCollectionFromReader(db.ExecuteReader("CMS_GetTaxCodes"));    
} 

फिक्स:

public static List<TaxCodeEntity> CMSGetTaxCodes() 
{ 
    Database db = DatabaseFactory.CreateDatabase(); 
    using (DbCommand dbCmd = db.GetStoredProcCommand("CMS_GetTaxCodes")) 
    { 
     using (IDataReader myReader = db.ExecuteReader(dbCmd)) 
     { 
      return GetTaxCodeCollectionFromReader(myReader); 
     }  
    } 
} 

उत्तर

2

मैं कई कार्यों को एक बार हो रहा रीडर खुला है देख सकते हैं। यदि निर्भर कार्य पर उठाए गए कोई अपवाद जैसे: myNav.Categories = GetCategoriesCollectionFromReader (पाठक); पाठक को खुले रख सकते हैं। सुरक्षित पक्ष विशेष रूप से पाठक को बंद करें। इस तरह:

public static NavigatorEntity GetNavigator(int navigatorID) 
    { 
     Database db = DatabaseFactory.CreateDatabase(); 
     object[] spParams; 
     spParams = new object[1]; 
     spParams[0] = navigatorID; 
     using (IDataReader reader = db.ExecuteReader("GetNavigator", spParams)) 
     { 
      try 
      { 
       if (reader == null) 
       { 
        throw new ArgumentNullException("reader"); 
       } 
       NavigatorEntity myNav = null; 
       if (reader.Read()) 
       { 
        myNav = GetNavigatorEntityFromReader(reader); 
       } 

       if (myNav != null) 
       { 
        reader.NextResult(); 
        myNav.Categories = GetCategoriesCollectionFromReader(reader); 

        reader.NextResult(); 
        myNav.RecommendedProducts = 
         ProductProvider.GetRecommendedProductCollectionFromReader(reader, false); 
       } 

       return myNav; 
      } 
      catch 
      { 
      } 
      finally 
      { 
       reader.Close(); 
      } 
     } 
    } 

इसके अलावा अपने एसक्यूएल सर्वर पर नजर रखना: sys.sysprocesses से

चयन DB_NAME (DBID), COUNT (DBID), loginame जहां DBID> 0 ग्रुप DBID द्वारा , लॉगिन

+0

आपकी प्रतिक्रिया के लिए राजीव, thx। पूरे आवेदन में बदलाव करने से पहले, मैं पहली बार पुष्टि करना चाहता हूं कि समस्या है। मैंने अपने मेजबान से अपवाद के समय पूल किए गए कनेक्शन के वर्तमान # के बारे में जानकारी प्रदान करने का अनुरोध किया है, साथ ही एक आईआईएस कार्यकर्ता प्रक्रिया मेमोरी डंप भी प्रदान किया है। इस बिंदु के रूप में, मुझे यह भी यकीन नहीं है कि मैंने जो कोड पोस्ट किया है वह अपराधी है, इसलिए प्राथमिकता # 1 समस्या की पहचान कर रही है। ऐसा करने के बारे में कोई और सुझाव कैसे? इसके अलावा, आपके द्वारा पोस्ट किया गया SQL आदेश, हमेशा COUNT (डीबीआईडी) के लिए 1 लौटाता है। –

1

डीबग करने का एक तरीका ट्रेस/लॉग/अपवाद हैंडलिंग के लिए प्रदर्शन काउंटर जोड़ना है। NumberOfActiveConnectionPoolGroups, NumberOfActiveConnectionPools और NumberOfPooledConnections शायद समस्या को डीबग करने के लिए आपको आवश्यक काउंटर वैल्यू हैं। MSDN Link

+0

मैं इसे आज़मा दूंगा। धन्यवाद। –

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

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