在我的 .Net 应用程序(在多个 pod 上运行)中,我使用以下连接字符串:
"User ID=;Password=;Host=;Port=;Database=;Pooling=true;Username=;ApplicationName=;Max Auto Prepare=200;Minimum Pool Size=90;Maximum Pool Size=100;Read Buffer Size=18000;Timeout=1;Command Timeout=5;"
(我知道 Minimum Pool Size=90
有点太高了,但这只是为了解决这个问题)
有了上面的内容,我预计每个 pod 与数据库服务器的连接将在 90 到 100 之间。但是,当我执行以下查询时:
select client_addr, count(*) used FROM pg_stat_activity where datname = 'my_app_name' group by client_addr;
结果显示每个 pod 最多有大约 30 个连接。
这就是我在 C# 代码中使用连接和执行查询的方式:
public async Task<IEnumerable<T>> GetGeneric<T>(string query, DynamicParameters parameters)
{
await using var connection = DbConnectionHelper.Create(myConnectionString);
return await connection.QueryAsync<T>(query, parameters);
}
数据库连接助手:
public static class DbConnectionHelper
{
public static NpgsqlConnection Create(string connectionString)
{
var connection = new NpgsqlConnection(connectionString);
return connection;
}
}
从这里documentation我可以阅读:
When a pool is created, multiple connection objects are created and added to the pool so that the minimum pool size requirement is satisfied.
意味着应在应用启动时为每个 pod 添加 90 个连接。不应该吗?
这引发了以下问题:
- 为什么不使用
最小池大小
? - 为什么我在执行
select client_addr, count(*) used FROM pg_stat_activity
时看不到 90 到 100 之间的数字?
最佳答案
您所指的文档不是 npgsql
的文档,因此不适用。
虽然 doc因为 npgsql
在 Minimum Pool Size
上不是很详细,我们可以查看代码并发现
- 没有提及在启动时打开多个连接
- 连接是closed仅当有超过
Minimum Pool Size
时
所以答案是您的客户不需要 90 个并发连接,因此它们尚未打开。
关于.net - Npgsql Minimum Pool Size 似乎没有被考虑在内,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74701041/