使用大量不同的连接字符串和连接池是否会降低效率?

Is using a big amount of different connection strings with connection pooling detrimental to efficiency?

在我们的数据库中,我们需要动态地创建和使用模式。为此,我们想使用动态 DbContext,它在构造时接受模式名称并将其用于此上下文中的所有查询。

我们的第一个想法是在搜索路径连接字符串参数中指定架构,从而导致数千个不同的连接字符串。我的问题是这是否是 npgsql 中连接池策略的预期用例。我读到为每个连接字符串管理一个单独的连接池,这将导致数千个连接池每个都有一个或两个连接,这看起来很浪费。但另一方面,在一些常见的用例中,每个用户都有自己的数据库角色。由于在连接字符串中也指定了Role,这个场景也不得不处理越来越多的连接字符串。

我们有一个备份策略,其中模式包含在 DbContext 的模型中。在这种情况下,我们将不得不管理数千个不同的模型,从而导致创建它们的开销或增加用于缓存它们的 RAM 使用,但每个上下文都将使用相同的连接字符串。

通读 this recent issue,其中专门处理此问题。

tl;dr 是的,连接字符串中的任何差异都会导致不同的连接池,这会对性能产生重大影响,因为连接绑定到特定租户并且无法共享 - 在一般情况下强烈建议只有一个游泳池。

解决此问题的一种方法(如问题中所述)是每次切换到新租户时手动设置 search_path。