在我的.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相关问答推荐

.NET 7,8 System.Text.Json反序列化多态参数

.NET模拟具有泛型返回类型的方法

AppShell - 返回导航失败,匹配的路由不明确......但我只注册了一次路由

为什么具有可为空值的 struct 的 HashSet 非常慢?

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

在 WPF 窗口中获取当前聚焦的元素/控件

具有透明背景且包含不透明控件的 WPF 窗口

如何在 WPF 应用程序中使用 App.config 文件?

HttpClient 和使用代理 - 不断得到 407

如何将 UI Dispatcher 传递给 ViewModel

什么是 SUT,它来自哪里?

在 .NET (C#) 中本地存储数据的最佳方式

向 .NET 应用程序添加脚本功能

如何将 WebResponse.GetResponseStream 返回转换为字符串?

文件按文件名模式存在

如何防止任务的同步延续?

beforefieldinit 标志有什么作用?

如何修复 .NET Windows 应用程序在启动时崩溃并出现异常代码:0xE0434352?

如果选中,则更改列表框项的 WPF DataTemplate

如何在 C# 中使用迭代器反向读取文本文件