在我的.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将有90100个到数据库服务器的活动连接.然而,当我执行以下查询时:

select client_addr, count(*) used FROM pg_stat_activity where datname = 'my_app_name' group by client_addr;

结果表明,每个pod 的最大连接数约为30个.

connections per client_addr count

这就是我在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个连接.不是吗?

这引发了以下问题:

  1. 为什么不用Minimum Pool Size
  2. 为什么我在执行select client_addr, count(*) used FROM pg_stat_activity时看不到介于90和select client_addr, count(*) used FROM pg_stat_activity之间的数字?

推荐答案

您所指的文档不是npgsql的文档,因此不适用.

虽然npgsqldocMinimum Pool Size上并不是很详细,但我们可以查看代码并发现

  1. 没有提到在启动时打开多个连接
  2. 只有当连接超过Minimum Pool Size个时,连接才是closed

因此,答案是您的客户端不需要90个并发连接,因此它们还没有打开.

.net相关问答推荐

在计算Total毫秒时,.NET TimeSpan类中是否存在错误?

是否有内置方法将 nuget 包引用为 csproj 中的文件?

标签从右向左增长

将毫秒转换为人类可读的时间间隔

Int32.ToString() 是特定于文化的吗?

如何在 C# 中创建 Word 文档?

哪个单元测试框架?

如何在 C# 中将 HTML 转换为文本?

如何从 .net 中的数组类型获取数组项类型

什么是编组?当某些东西被编组时会发生什么?

新的 netstandardapp 和 netcoreapp TFM 有什么区别?

WCF服务客户端:内容类型text/html;响应消息的charset=utf-8 与绑定的内容类型不匹配

我可以在没有两个查询的情况下通过布尔标准将 IEnumerable 一分为二吗?

析构函数、dispose 和 finalize 方法的区别

使用 XmlDocument 读取 XML 属性

为什么会出现编译错误使用未分配的局部变量?

强制 XmlSerializer 将 DateTime 序列化为 'YYYY-MM-DD hh:mm:ss'

在 .NET 中,null 的哈希码是否应该始终为零

使用 LINQ 搜索树

SqlCommand.CommandTimeout 和 SqlConnection.ConnectionTimeout 有什么区别?