簡體   English   中英

如何修復“從池中獲取連接之前已過超時時間”

[英]How to fix “Timeout period elapsed prior to obtaining a connection from the pool”

在加載網站上的一個頁面時,似乎經常出現以下錯誤。

“超時已過期。在從池中獲取連接之前已經過了超時時間。這可能是因為所有池連接都在使用中並且達到了最大池大小。”

根據我從搜索中發現的內容,似乎數據庫連接沒有正確關閉並因此泄漏。 但我對 ASP.net 不太熟悉,所以非常感謝一些指導。

private void DisplayData()
    {
        SqlConnection objCon = new SqlConnection();
        objCon.ConnectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
        objCon.Open();

        SqlCommand objCmd = new SqlCommand();
        objCmd.Connection = objCon;

        if (Request["Category"] == "some_cat")
        {
            objCmd.CommandText = "Select * From Community Where Category = N'some_cat' Order By Num Desc";
        }
        else if (Request["Category"] == "other_cat")
        {
            objCmd.CommandText = "Select * From Community Where Category = N'other_cat' Order By Num Desc";
        }
        else if (Request["Category"] == "Blog")
        {
            objCmd.CommandText = "Select * From Community Where Category = N'Blog' Order By Num Desc";
        }
        else if (Request["Category"] == "All")
        {
            objCmd.CommandText = "Select * From Community Where Category != N'Blog' Order By Num Desc";
        }


        objCmd.CommandType = CommandType.Text;

        SqlDataAdapter objDa = new SqlDataAdapter();
        objDa.SelectCommand = objCmd;

        DataSet objDs = new DataSet();

        objDa.Fill(objDs, "Community");

        this.ctlList.DataSource = objDs.Tables[0];
        this.ctlList.DataBind();

    objCon.Close();

    }

您的問題可能是由於缺少連接 object 造成的。 應釋放一次性object (IE 調用其 Dispose 方法)以釋放 object 中包含的所有非托管資源。 using 語句將使這變得簡單,因為即使在出現異常的情況下,它也會為包含在其起始塊中的 object 調用 Dispose 方法。

using 語句是編寫 try/finally 塊的簡單方法

SqlConnection con = new SqlConnection();
try
{

}
finally
{
    con.Dispose(); // And this will also close the connection
}

因此,您的代碼可以更改為:

private void DisplayData()
{
    using(SqlConnection objCon = new SqlConnection())
    using(SqlCommand objCmd = new SqlCommand())
    {
         objCon.ConnectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
        objCon.Open();

        objCmd.Connection = objCon;
        objCmd.CommandText = "Select * From Community Where Category = @cat Order By Num Desc";
        objCmd.Parameters.Add("@cat", SqlDbType.NVarChar).Value = Request["Category"].ToString();

        if (Request["Category"] == "All")
        {
           objCmd.CommandText = "Select * From Community Where Category != @cat Order By Num";
           objCmd.Parameters[0].Value = "Blog"    
        }
        SqlDataAdapter objDa = new SqlDataAdapter();
        objDa.SelectCommand = objCmd;
        DataSet objDs = new DataSet();
        objDa.Fill(objDs, "Community");
        this.ctlList.DataSource = objDs.Tables[0];
        this.ctlList.DataBind();
}

當然,要消除連接池問題,您應該檢查創建 SqlConnection 並實現 using 塊的所有代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM