当您连接到数据库时,会消耗服务器资源。如果您有很多数据库连接,您可能会消耗大量服务器资源。一种缓解这种情况的方法是使用连接池,它允许您拥有大量的连接,但保持较低的服务器资源使用率。您到数据库的客户端连接越多,连接池就越有用。

默认情况下,PostgreSQL 为每个服务器连接创建一个单独的后端进程。连接池使用名为 PGBouncer 的工具来将多个连接池化到一个后端进程。PGBouncer 自动交错客户端查询,以更有效地使用有限数量的后端连接,从而降低服务器上的资源使用率并提高整体性能。

没有连接池,数据库连接由 PostgreSQL 后端进程直接处理,每个连接一个进程

Connection pooling - pooling disabled

当您添加连接池时,所需的后端连接更少。这释放了服务器资源用于其他任务,例如磁盘缓存

Connection pooling - pooling enabled

连接池允许您同时处理多达 5000 个数据库客户端连接。您可以根据可用的 CPU 核心数来计算可以处理的连接数。您应该至少每个核心有一个连接,但要确保您没有使每个核心过载。根据您的工作负载,一个好的连接数目标是可用 CPU 核心数的 3 到 5 倍。

有几种不同的池模式

  • 事务 (默认)
  • 会话
  • 语句

这是默认的连接池模式。它允许每个客户端连接在单个事务期间轮流使用后端连接。当事务提交时,后端连接返回到池中,下一个等待的客户端连接立即重用相同的连接。只要大多数事务执行得很快,这就可以为查询提供快速的响应时间。这是最常用的模式。

此模式保持客户端连接,直到客户端断开连接。当客户端断开连接时,服务器连接将返回到连接池空闲连接列表,以等待下一个客户端连接。客户端连接在 TCP 级别被接受,但只有当另一个客户端断开连接并将后端连接释放回池中时,它们的查询才会继续。当您需要传入连接的等待队列,同时保持较低的服务器内存使用率时,此模式非常有用。但是,它在大多数常见场景中并不有用,因为后端连接回收速度非常慢。

此模式类似于事务池模式,不同之处在于它不是允许运行完整事务,而是在每个数据库语句(例如 SELECT、INSERT、UPDATE、DELETE)之后循环服务器端连接。在此模式下不允许包含多个 SQL 语句的事务。此模式最适合使用分片前端代理的专用工作负载。

您可以从 TimescaleDB 托管服务门户设置连接池。确保您已创建要添加连接池的服务。

  1. MST 门户中,导航到“服务”列表,然后单击要添加连接池的服务的名称。
  2. 在“服务概览”页面中,导航到“池”选项卡。当您创建了一些池时,它们会显示在此处。
  3. 单击 Add Pool 以创建新池。
  4. Create New Connection Pool 对话框中,使用以下设置
    • Pool name 字段中,键入新池的名称。此名称将成为池化客户端连接的数据库 dbname 连接参数。
    • Database 字段中,选择要连接的数据库。每个池只能连接到一个数据库。
    • Pool Mode 字段中,选择要使用的池模式
    • Pool Size 字段中,选择此池一次可以使用的最大服务器连接数。
    • Username 字段中,选择要用于连接数据库的数据库用户名。
  5. 单击 Create 以创建池,并在列表中查看新池的详细信息。您可以单击池详细信息旁边的 Info 以查看更多信息,包括 URI 和端口详细信息。
注意

池化服务器使用与常规服务器不同的端口号。这允许您同时使用池化和非池化连接。

关键词

在此页面上发现问题?报告问题 或 在 GitHub 上编辑此页面