NPgsql 连接池和性能计数器

NPgsql connection pool and performance counters

首先介绍一下背景: 1. 了解 NPGSQL 如何在 ASP.NET REST API

中使用连接池

环境: - 我们有一个 REST API 控制器,它首先查询项目列表(到 RDS),然后每个列表中的每个项目我们需要获得一些额外的值,所以我们使用 Parallel.ForEach 语句

进程:

我已经按照 http://www.npgsql.org/doc/performance.html#performance-counters 检查 NPGSQL 如何处理连接,还在连接字符串中添加了以下内容: "CommandTimeout=50000;TIMEOUT=1024;POOLING=True;MINPOOLSIZE=1;MAXPOOLSIZE=100;Use Perf Counters=true;"

但我发现了一个奇怪的结果:

NumberOfNonPooledConnections 和 NumberOfPooledConnections 在我的例子 (56) 中始终相同,我们使用 Parallel.ForEach 查询多个项目。

NumberOfActiveConnectionPools 的值为 1。

一开始我不太明白这是怎么回事,真的是用连接池吗?

然后我停止进程删除“;POOLING=True;”来自连接字符串,我得到了相同的结果。

最后我设置了“;POOLING=false;”并再次执行,现在 NumberOfPooledConnections 达到了 2378,然后它开始超时打开新连接。 我还在 RDS 性能指标中注意到连接数从未超过 110 个连接。

所以问题是: 设置 MaxPoolSize 参数的标准是什么? 100 好像很正常。

在ASP.NET中连接池是由实例处理的?所以从 IIS 中的同一个应用程序池建立的所有连接都将被重用或每次执行?

首先,ASP.NET(web端)对Npgsql的连接池或一般的ADO.NET绝对没有影响,所以最好不考虑Npgsql和ADO.NET的推理关于网络。

其次,您没有说明您使用的是哪个版本的 Npgsql。

除此之外,在查看性能计数器之前,您看到的问题到底是什么?您是否在 PostgreSQL 端看到太多连接?你可以检查这个 by querying pg_stat_activity.

如果启用了 Npgsql 池(连接字符串中的 Pooling=true,它也是默认设置),那么当您调用 NpgsqlConnection.Open() 时,如果物理连接可用,将从池中获取一个物理连接。当您关闭或处置该 NpgsqlConnection 时,它将返回到池中以供以后重用。如果您看到 PostgreSQL 端的物理连接增加太多,这可能表明您忘记了 close/dispose 代码中的连接并且存在泄漏。

性能计数器功能有助于了解正在发生的事情,但不幸的是它没有经过充分测试并且可能包含错误。因此,在开始查看之前请确保存在实际问题(并且至少报告您正在使用的 Npgsql 版本)。