四月 14, 2024
摘要:PgBouncer 是 PostgreSQL 的一个轻量级连接池程序。
目录
描述
pgbouncer 是一个 PostgreSQL 连接池。任何目标应用程序都可以连接到 pgbouncer,就像它是 PostgreSQL 服务器一样,pgbouncer 将创建到实际服务器的连接,或者它将重用其中一个现有的连接。
pgbouncer 的目的是为了降低打开 PostgreSQL 新连接时的性能影响。
为了不影响连接池的事务语义,pgbouncer 在切换连接时支持多种类型的池:
-
会话连接池
最礼貌的方法。当客户端连接时,将在客户端保持连接的整个持续时间内分配一个服务器连接。当客户端断开连接时,服务器连接将放回到连接池中。这是默认的方法。
-
事务连接池
服务器连接只有在一个事务里的时候才赋予客户端。在 PgBouncer 注意到事务结束的时候,服务器连接将会放回连接池中。
-
语句连接池
最激进的模式。在查询完成后,服务器连接将立即被放回连接池中。这个模式中不允许多语句的事务,因为它们会中断。
pgbouncer 的管理接口,由连接到特殊“虚拟”数据库pgbouncer
时,一些新的可用的SHOW
命令组成。
主要特性
-
支持几种不同的连接模式:
-
会话级连接池
最礼貌的方法。在客户端连接的时候,在它的连接生命期内, 会给它赋予一个服务器连接。在客户端断开的时候,服务器连接会放回到连接池中。
-
事务级连接池
仅在事务期间将服务器连接分配给客户端。当 PgBouncer 注意到该事务结束时, 服务器将被放回到池中。它打破了应用程序对后端连接的期望。 只有在应用配合这样的使用模式,没有使用会破坏这种使用模式的时候才能用这个连接方式。 参阅下表获取会破坏这种模式的特性。
-
语句级连接池
最积极的方法。这是一个事务池的一个扭曲的变种,不允许执行多语句事务。 这意味着在客户端上强制 “autocommit” 模式,主要针对 PL/Proxy。
-
-
内存需求低(默认是每个连接 2K)。这是因为 PgBouncer 不需要一次性查看所有包。
-
它不绑定到一个后端服务器,目标数据库可以位于不同的主机上。
-
支持在线重新配置大部分设置。
-
支持在线重启/升级,而不用删除客户端连接。
池模式的 SQL 功能图
下面的表列出了各种 PostgreSQL 特性,和它们是否能与 PgBouncer 池模式一起共用。请注意,“事务”池打破了客户端对服务器的期望, 只有在应用程序不使用非工作功能的情况下才能使用。
特性 | 会话池 | 事务池 |
---|---|---|
启动参数 [1] | 支持 | 支持 |
SET/RESET | 支持 | 从不支持 |
LISTEN | 支持 | 从不支持 |
NOTIFY | 支持 | 支持 |
WITHOUT HOLD CURSOR | 支持 | 支持 |
WITH HOLD CURSOR | 支持 | 从不支持 |
协议级预备计划 | 支持 | 支持 [2] |
PREPARE / DEALLOCATE | 支持 | 从不支持 |
ON COMMIT DROP 临时表 | 支持 | 支持 |
PRESERVE/DELETE ROWS 临时表 | 支持 | 从不支持 |
重置缓存的计划 | 支持 | 支持 |
LOAD 语句 | 支持 | 从不支持 |
会话级咨询锁 | 支持 | 从不支持 |
[1]. 启动参数有:client_encoding
、DateStyle
、IntervalStyle
、Timezone
、standard_conforming_strings
和application_name
。PgBouncer 会检测它们的更改,因此可以保证它们对客户端保持一致。如果您需要 PgBouncer 支持更多功能,请查看track_extra_parameters
和ignore_startup_parameters
。
[2]. 您需要将max_prepared_statements
更改为一个非零值,以启用此支持。