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;

    }
4

3 回答 3

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;
  }
}
于 2011-03-28T14:13:20.543 回答
1

在看到您的代码后,我想指出两件事,将您的 SqlCommand、DataReader 和 sqlConnection 包装在 using 语句(是嵌套 using 语句)中,并且当您创建 List 时,您不必在之后调用 clear(),因为列表应该已经初始化为 emtpy(至少我在 c# 中是这样认为的)。

于 2011-03-28T14:08:33.883 回答
0

测试和测试:

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

使用表达式等,最后我发现每个 OpenConnection 的“Open Pools”问题没有重用维护的“Pool”(AWAITING COMMAND)导致 ASP.NET 客户端应用程序饱和(唯一的方法是重新启动 IIS 以释放),我意识到这是对 .config 中连接字符串的调用:

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

显然他调用了外部程序集,导致连接字符串或哈希出现“差异”。

解决方案:

我添加了程序集:

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

这解决了问题,每个“Open()”不再执行“池”。

于 2016-03-09T18:17:36.173 回答