在我的.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);
}
DbConnectionHelper:
public static class DbConnectionHelper
{
public static NpgsqlConnection Create(string connectionString)
{
var connection = new NpgsqlConnection(connectionString);
return connection;
}
}
从这documentation个字中,我可以读到:
创建池时,会创建多个连接对象并将其添加到池中,以便满足最小池大小要求.
这意味着每个Pod都应该在应用程序启动时添加90个连接.不是吗?
这引发了以下问题:
- 为什么不用
Minimum Pool Size
? - 为什么我在执行
select client_addr, count(*) used FROM pg_stat_activity
时看不到介于90和select client_addr, count(*) used FROM pg_stat_activity
之间的数字?