簡體   English   中英

達到最大連接池

[英]Max connection pool reached

我有一個簡單的SQL語句,我想在短時間內調用幾次(在<10秒內約400次調用)。 達到大約200次調用后,我收到以下SQL錯誤:

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

我已經閱讀了一些有關此錯誤的帖子。 所有這些都建議using塊包裝代碼或者最后調用SQL連接的.Close()方法。 我已經實現了兩者,它仍然無法正常工作。 我沒有正確實現它嗎? (該方法在沒有重復調用時工作正常)。

我的代碼看起來像這樣:

public static ObjectModel GetObject(int objGroupId, DateTime date)
{
    ObjectModel obj = new ObjectModel () { EffectiveFrom = date };

    // Get connection string from the App.Config file
    string connectionString = ConfigurationManager.AppSettings["ConnectionString"];

    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        connection.Open();

        using (SqlCommand command = new SqlCommand("[dbo].[GetObjectData]", connection))
        {
            // Request the data which were in force on the specified date
            command.CommandType = CommandType.StoredProcedure;
            command.Parameters.Add("@Date", SqlDbType.DateTime).Value = obj.EffectiveFrom;
            command.Parameters.Add("@ObjecGrouptId", SqlDbType.Int).Value = objGroupId;

            using (SqlDataReader reader = command.ExecuteReader())
            {
                while (reader.Read())
                {
                    int objId = reader.GetInt32NullIsZero("Id");
                    decimal value = reader.GetDecimalNullIsZero("value");
                    SetObjData(obj, objId, value);
                }
            }
        }

        connection.Close();
    }                

    return obj;
}

你展示的代碼看起來干凈; 所有正確的using等都在那里。 這讓我懷疑此代碼之外的東西是保持連接並占用池。 唯一知道的是這樣的功能:環境事務,即TransactionScope

作為調試此假設的調試工具,我建議嘗試抑制 TransactionScope (如果有),您可以通過以下方式執行:

using (var tran = new TransactionScope(TransactionScopeOption.Suppress))
{
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        connection.Open();

        //... the rest of your code

        connection.Close();
    }                

    tran.Complete();
}

請注意, connection的創建和Open必須抑制區域內進行,以便對其進行計數。

如果這使問題消失,那么:環境事務導致所有連接在更廣泛的事務中被登記 - 可能是DTC事務(因為LTM事務可以重新使用連接,IIRC)。

所以: 如果這樣修復它,那么坦率地說我的建議是更改方法以允許您選擇性地將連接作為輸入傳遞,允許您為400個操作重用單個連接而不是依賴於連接池。


重要的是:抑制交易通常不是一個好主意; 那次交易是有原因的。 這里的代碼只是一個診斷幫助來調查這是否是問題。

問題解決了。 事實證明,有一種(完全不同的方法)是async 我將其更改為Task (而不是void )並添加了await 所以@JeroenMostert走在了正確的軌道上。 我仍然不明白為什么異常總是發生在與async部分無關的方法中。

暫無
暫無

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

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