[英].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.