2011-03-28 94 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; 

这解决了这个问题,没有更多的 “池” 是由每个 “打开()” 执行。

相关问题