.net - Npgsql Minimum Pool Size 似乎没有被考虑在内

标签 .net postgresql connection-pooling npgsql

在我的 .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);
}
数据库连接助手:
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 个连接。不应该吗?

这引发了以下问题:

  1. 为什么不使用最小池大小
  2. 为什么我在执行 select client_addr, count(*) used FROM pg_stat_activity 时看不到 90 到 100 之间的数字?

最佳答案

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

虽然 doc因为 npgsqlMinimum Pool Size 上不是很详细,我们可以查看代码并发现

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

所以答案是您的客户不需要 90 个并发连接,因此它们尚未打开。

关于.net - Npgsql Minimum Pool Size 似乎没有被考虑在内,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74701041/

相关文章:

c# - 搜索多列 ListView C#

.net - 如何在win应用程序的datagridview中启用行值可编辑?

multithreading - 并发插入和更新 postgres

ruby-on-rails - 空闲后 "PGError: no connection to the server"

postgresql - 如何获取聚合函数选择的行的id?

java - 在 JSch 中使用连接池

c# - 将属性放在方法的特定参数上有什么用处?

c# - 在 GDI+ 中绘制带渐变的折线

c# - 关闭 SQLDataReader - 如何判断它们是否已关闭?

oracle - 如何在连接错误时清除 ODP.NET 连接池?