像 PostgreSQL 这样的数据库的连接池究竟做了什么?

What exactly does a connection pool for databases like PostgreSQL do?

我知道连接池是一个可重复使用的连接池,可以加快到数据库的流量,因为它可以重复使用连接而不是不断地创建新连接。

但这是一个非常高层次的解释。它没有解释连接的含义以及连接池工作的原因,因为即使使用连接池,例如 client -> PgBouncer -> PostgreSQL,虽然客户端不必创建到数据库的连接,但它仍然必须连接才能创建到代理的连接。

那么从(例如)client -> PgBouncer 创建的连接是什么?为什么创建此连接比创建连接 PgBouncer -> PostgreSQL 更快?

连接池有两种用途:

  • 它一直阻止打开和关闭数据库连接

    与 pgBouncer 建立 TCP 连接肯定会产生一定的开销,但这比建立数据库连接便宜。当您启动数据库连接时,会完成额外的工作:

    • 服务器进程启动,这比 TCP 连接昂贵得多

    • PostgreSQL 加载缓存的元数据表

  • 它限制了客户端连接数,从而防止数据库过载

    与限制 max_connections 相比的优势在于,超过限制的连接不会收到错误,但会排队等待连接空闲。