池化时连接如何分组

本文关键字:连接 | 更新日期: 2023-09-27 18:32:19

我正在使用Npgsql连接到Windows上的Postgres数据库,使用C#。在连接字符串中,我有:

Database=dbname;Userid=username;Password=password;MinPoolSize=1;MaxPoolSize=50;ConnectionLifeTime=300;

我的应用程序有多个数据库。每个数据库都有一个特定于该数据库的用户。此外,还有一个超级用户有权访问所有数据库。它用于创建新的数据库和它们的用户。

我所看到的是,每个数据库的用户都有一个数据库连接处于打开状态。因此,当超级用户创建数据库时,它会运行几个不同的查询,然后在最后一个查询完成后,它处于空闲状态并且不会被回收。这导致服务器上的连接总数比我预期的要高得多。

如果我看一下pg_stat_activity我会看到的是(对于 2 个数据库):

| user      | database | state  | query                       |
|-----------|----------|--------|-----------------------------|
| db1_user  | db1      | active | SELECT * FROM table         |
| db2_user  | db2      | idle   | SELECT * FROM another_table |
| superuser | db1      | idle   | CREATE USER db1_user        |
| superuser | db2      | idle   | CREATE USER db2_user        |

超级用户查询只是永远闲置。

我想知道的是,每个用户的连接池是每个数据库吗?使用上面的连接字符串,每个用户是否会在他们连接到的每个数据库上获得最多 50 个连接的池?既然MinPoolSize=1每个用户在他们连接到的每个数据库上都有一个空闲连接?

池化时连接如何分组

它以连接字符串本身为键。对于大多数用途,这很有意义;一个通常使用少量连接字符串(通常只有一个或两个),并且该字符串被大量使用。

对于此处的那种用法,根本不对用户字符串使用池化可能更有意义,而只对具有更大重用性的超级用户字符串使用池化。