.net - .NET sql 连接超过最大池大小
问题描述
我编写了一个简单的应用程序来测试连接字符串中的 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);
推荐阅读
- python - Google Colab - 写出 .csv 但覆盖文件?
- c - 在 http 中接收的字节大小可变。我可以假设单词“GET”或“POST”或“DELETE”将被传递到我的同一个 read() 函数调用
- jira - 如何通过 Rest API 在 JIRA 中向自定义字段(单选)添加选项
- javascript - 点击不通过,但说它是 Selenium js
- plotly - 为什么我不能使用 fig.show() 来绘制我的图表
- github - 使用 API/Actions Pluginfor Jenkins 从 Jenkins Pipeline 触发 GitHub Actions
- ios - 仅当将相机向右横向旋转时,相机才会聚焦点击位置的对角线位置
- azure - AAD 连接升级 V2.0 后出现 dn-attributes-failure 错误
- google-analytics - Google Analytics - 一周后删除的用户 ID 数据
- linux - openssl-req 中 -signkey 选项的作用是什么?