【发布时间】:2019-11-20 11:09:34
【问题描述】:
我有一个 Azure 持久函数,它与同样托管在 Azure 中的 PostgreSQL 数据库进行交互。
PostgreSQL 数据库的连接限制为 50,此外,我的连接字符串将连接池大小限制为 40,为超级用户/管理员连接留出了空间。
尽管如此,在某些负载下我得到了错误
53300:剩余的连接槽保留给非复制超级用户连接
This documentation from Microsoft 似乎相关,但我似乎无法制作静态客户端,并且正如它所提到的,
因为您仍然会用完连接,所以您应该优化与数据库的连接。
我有这个方法
private IDbConnection GetConnection()
{
return new NpgsqlConnection(Environment.GetEnvironmentVariable("PostgresConnectionString"));
}
当我想与 PostgreSQL 交互时,我确实喜欢这样
using (var connection = GetConnection())
{
connection.Open();
return await connection.QuerySingleAsync<int>(settings.Query().Insert, settings);
}
所以我正在创建(和处理)大量NpgsqlConnection 对象,但根据this,这应该没问题,因为连接池是在幕后处理的。但 Azure Functions 中的某些内容可能会使这种想法无效。
我注意到我最终得到了很多空闲连接(来自 pgAdmin):
基于此,我尝试摆弄Npgsql connection parameters,例如Connection Idle Lifetime、Timeout 和Pooling,但连接过多的问题似乎在某种程度上仍然存在。此外,我尝试限制并发编排器和活动函数的数量(请参阅this doc),但这似乎部分违背了 Azure Functions 可扩展的目的。它确实有帮助 - 我得到的太多连接错误更少)。据推测,如果我继续用较低的数字测试它,我什至可能会消除它,但同样,这似乎与这一点无关,可能还有另一种解决方案。
如何在不最大化连接的情况下将 PostgreSQL 与 Azure Functions 结合使用?
【问题讨论】:
-
您绝对应该创建一个不需要每次运行都重新初始化的公共静态客户端。请向我们展示您的代码
-
public static客户端会是什么样子?如果我创建一个public static NpgsqlConnection,我会收到错误 > A command is already in progress -
@ScottH 我的回答没有帮助吗?
-
@HariHaran 不幸的是没有。
-
目前最好的解决方案似乎是将连接池限制为 5 个连接并扩展
Timeout值。
标签: postgresql azure azure-functions npgsql azure-durable-functions