簡體   English   中英

.NET SQL連接超出最大池大小

[英].NET sql connections exceeding max pool size

我編寫了一個簡單的應用程序來測試連接字符串中的最大池大小= 50。

    static void Test1()
    {
        string connectionString = @"Server=.;Database=appsdb;Trusted_Connection=True;Application Name=JH;Max Pool Size=50";
        for (int i = 1; i <= 100; i++)
        {
            var conn = new SqlConnection(connectionString);
            conn.Open();
            using (var cmd = new SqlCommand("select newid()", conn))
            {
                using (var r = cmd.ExecuteReader())
                {
                    while (r.Read())
                    {
                        Console.WriteLine($"[{Thread.CurrentThread.ManagedThreadId}] {i} - {r.GetGuid(0)}");
                    }
                }
            }
        }
        Console.WriteLine("Done");
        Console.ReadLine();
    }

我讓它運行51個連接,最初希望第51個連接失敗,但並沒有失敗。
它在第71次連接時始終失敗,但有以下異常:

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

當我用sp_who (或sp_who2 )檢查時,我可以看到確實有50個連接。 這真令人困惑。
我可以理解.NET是否以某種方式讓您重用連接, 但是為什么在第71步?
為什么只允許額外的20個(邏輯)連接? 為什么不是19或47?

似乎您沒有保留for循環的迭代之間的連接。 這意味着,每次您遍歷for循環時,上一次迭代的連接都可以進行垃圾回收,這會將基礎連接釋放回池中。 因此:大概發生了垃圾收集。 要對此進行測試:保持可用的連接可用-將它們放在列表或類似列表中。 例如:

var list = new List<SqlConnection>();
for (int i = 1; i <= 100; i++)
{
    var conn = new SqlConnection(connectionString);
    list.Add(conn);
    conn.Open();
    // ... etc removed
}
GC.KeepAlive(list);

暫無
暫無

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

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