2011-03-28 95 views
2

我正在編寫C#代碼,並使用LINQ和一些存儲過程,我小心打開和關閉連接,但我不斷收到此錯誤。超時已過期

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. 

我的代碼完美的工作除了這個錯誤的發生,我能做些什麼呢?

感謝您的任何想法。

public static List<int> GetIslemIdleribySPbyCariId(int cariId) 
    { 
     string connString = System.Configuration.ConfigurationManager.ConnectionStrings["LocalSqlServer1"].ConnectionString; 

     SqlConnection sqlConn = new SqlConnection(connString); 
     sqlConn.Open(); 

     List<int> islemidleri = new List<int>(); 
     islemidleri.Clear(); 

     SqlCommand cmd; 
     cmd = new SqlCommand("GetIslemIdleri", sqlConn); 
     cmd.CommandType = CommandType.StoredProcedure; 
     cmd.Parameters.Add(new SqlParameter("@CARIID", cariId)); 

     using (var reader = cmd.ExecuteReader()) 
     { 
      while (reader.Read()) 
      { 
       islemidleri.Add(reader.GetInt32(0)); 

      } 
      cmd.Parameters.Clear(); 
     } 

     sqlConn.Close(); 

     return islemidleri; 

    } 
    /// <summary> 
    /// SP kullanarak dovizturlerini döndürür 
    /// </summary> 
    /// <returns>string listesi döndürür için döviz türleri var TL, USD vs.</returns> 
    public static List<string> GetDovizTurleribySP() 
    { 
     string connString = System.Configuration.ConfigurationManager.ConnectionStrings["LocalSqlServer1"].ConnectionString; 

     SqlConnection sqlConn = new SqlConnection(connString); 
     sqlConn.Open(); 

     List<string> dovizTanimlari = new List<string>(); 

     string commandGetDovizTanimlari = "EXEC GetDovizTanimlari"; 
     SqlCommand cmd; 
     cmd = new SqlCommand(commandGetDovizTanimlari, sqlConn); 

     using (var reader = cmd.ExecuteReader()) 
     { 
      while (reader.Read()) 
      { 
       dovizTanimlari.Add(reader.GetString(0)); 
      } 

     } 
     return dovizTanimlari; 

    } 
+1

你能展示一些代碼來演示你如何管理連接嗎? – 2011-03-28 14:00:46

+0

@Chris Taylor我剛剛添加了一些代碼Mr.Taylor。 – Bastardo 2011-03-28 14:08:42

回答

3

從您的代碼中,您沒有關閉GetDovizTurleribySP函數中的連接。我建議您使用using語句來確保即使發生異常也會關閉連接。

它可能是這個樣子

public static List<string> GetDovizTurleribySP() 
{ 
    string connString = System.Configuration.ConfigurationManager.ConnectionStrings["LocalSqlServer1"].ConnectionString; 

    using (SqlConnection sqlConn = new SqlConnection(connString)) 
    { 
    sqlConn.Open(); 

    List<string> dovizTanimlari = new List<string>(); 

    string commandGetDovizTanimlari = "EXEC GetDovizTanimlari"; 
    SqlCommand cmd; 
    cmd = new SqlCommand(commandGetDovizTanimlari, sqlConn); 

    using (var reader = cmd.ExecuteReader()) 
    { 
     while (reader.Read()) 
     { 
     dovizTanimlari.Add(reader.GetString(0)); 
     } 

    } 
    return dovizTanimlari; 
    } 
} 
+0

謝謝Mr.Taylor,我剛剛看到缺少sqlConn.Close()。就像我從你的代碼理解的,如果我使用「使用」我不必寫sqlConn.Close(),是嗎? – Bastardo 2011-03-28 14:18:12

+1

@EmreVeriyaz,這是正確的。 using語句實際上將代碼封裝在try/finally中,並將對using語句所引用的對象調用Dispose方法。這將確保即使代碼由於異常或提前返回等原因而未達到函數末尾時連接仍然關閉。您對DataReader使用了相同的概念,但您一旦確定了讀者已關閉完成了它,這是很好的。 – 2011-03-28 14:24:12

1

看到你的代碼後,那裏有兩件事情我想指出,換你的SqlCommand,DataReader的和SqlConnection的使用語句(是嵌套using語句),並在創建列表,你不必調用clear ()之後,列表應該已經初始化爲emtpy(至少我認爲是在c#中)。

+0

我沒有像這樣使用它,但我現在會嘗試,謝謝你的建議。 – Bastardo 2011-03-28 14:09:49

+0

謝謝我將重建我的代碼我發現錯誤的原因,它只是一個缺少sqlConn.Close()之前返回dovizTanimlari ;. :) – Bastardo 2011-03-28 14:16:01

+1

這就是使用語句派上用場的地方,即使拋出異常,它也會被關閉並清理乾淨,這意味着您沒有邏輯錯誤 – 2011-03-28 14:19:24

0

測試和測試:

Close(); 
Dispose(); 
SqlConnection.ClearPool(connection); 
SqlConnection.ClearAllPools(); 

使用的表達等等,最後我發現,「開放池」每個問題OpenConnection不會重用維護的「池」(AWAITING COMMAND),導致ASP.NET客戶端應用程序中出現飽和(唯一的方法是重新啓動IIS以釋放),我意識到這是對.config中連接字符串的調用:

*System.Configuration.ConfigurationManager.ConnectionStrings ["ConnectionSQL"] ConnectionString.;* 

顯然他調用外部程序集,導致連接字符串或散列中的「差異」。

解決方案:

我相加的組件:

System.Configuration"** and replacement implicitly invoking: ConfigurationManager.ConnectionStrings ["ConnectionSQL"] ConnectionString; 

這解決了這個問題,沒有更多的 「池」 是由每個 「打開()」 執行。

相關問題