2014-05-19 63 views
6

我正在使用WebApiAngularJS應用程序。我花了一些時間去應用程序後得到這個異常。我在這個應用程序中使用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. 在您連接始終關閉finally塊

  2. 增加池大小您連接喜歡字符串 string connectionString =「Data Source = localhost; Initial Catalog =北風;」 + 「集成安全性= SSPI;最小池大小= 10;最大池大小= 100」;

           or 
    
  3. 不要使用在所有 字符串的connectionString =池 「數據源=本地主機;初始目錄=羅斯文;」 + 「Integrated Security = SSPI; Pooling = false;」;

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()是做它的釘子。看起來MS應該改變他們的建議,因爲我發現他們的網站都建議不要使用try { } finally { con.Close(); }模式。我沒有明確地嘗試這一點,因爲該模式在我們整個數據庫層中相當普遍,並且希望找到更接近的東西。

我希望這可以幫助別人。

0

力垃圾收集器調用:

System.GC.Collect() 
+0

這適用於我的情況。但我更喜歡另一種方法:不要在連接字符串中使用連接池(...; Pooling = false; ...)。所以,我可以在系統級本身留下垃圾回收。 –

+1

請拜託!除非完全確定它是一個好主意,否則不要強制執行GC(很可能,它們不是)。請參閱[本答案](https://stackoverflow.com/questions/233596/best-practice-for-forcing-garbage-collection-in-c-sharp)以獲取更多信息。 –

0

有點老了,對不起陷了這一點,但這個星期發生在我們身上的工作:

無論是作爲@sohail納瑟爾回答,你的連接AREN沒有關閉,或者你有一個沒有正確使用的數據類:

如果循環105次,並且在每個循環中聲明一個新的數據對象,並用它查詢數據庫,則將創建105個連接(因此,即使您關閉並且最多也允許您允許100個最大值)正確地處理對象,SQL仍然需要時間將該連接重新分配給新用戶。

0

有人建議圍繞SqlConnection和SqlCommand對象使用using語句。

請注意,如果您有一個函數在SqlDataReader循環中使用yield return返回一個IEnumerable,那麼推薦模式爲而不是。這樣做,在數據讀取器執行之前,數據庫連接將被關閉。

而是將CommandBehavior.CloseConnection參數應用於ExecuteReader調用。

相關問題