首先了解一些背景: 1.了解ASP.NET REST API中NPGSQL如何使用连接池
环境: -我们有一个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中同一应用程序池建立的所有连接将被重用还是按每次执行?。
答案 0 :(得分:1)
首先,ASP.NET(Web端)对Npgsql的连接池或ADO.NET完全没有影响,因此最好在不考虑Web的情况下考虑Npgsql和ADO.NET。
第二,您不是在说使用的是哪个版本的Npgsql。
除此之外,在查看性能计数器之前,您所看到的问题到底是什么?您是否在PostgreSQL端看到太多连接?您可以检查此by querying pg_stat_activity
。
如果打开了Npgsql池(连接字符串中的Pooling=true
,它也是默认值),那么当您调用NpgsqlConnection.Open()
时,将从池中建立一个物理连接(如果有)。当您关闭或处置该NpgsqlConnection时,它将被返回到池中以供以后重用。如果您发现PostgreSQL上的物理连接增加太多,则可能是您忘记在代码中关闭/布置连接并且泄漏的迹象。
性能计数器功能对于了解正在发生的事情很有用,但是不幸的是,它未经充分测试,可能包含错误。因此,在开始研究它之前,请确保存在一个实际问题(至少报告您正在使用的Npgsql版本)。