PgBouncer
+1. 概述
+PgBouncer 是轻量级连接池中间件,部署在应用层与数据库之间,通过复用后端连接来降低连接开销、保护数据库资源、提高应用并发性能。
+PgBouncer 使用标准 PostgreSQL 通信协议,IvorySQL 完全兼容该协议。
+三种连接池模式:
+| 模式 | +说明 | +适用场景 | +
|---|---|---|
session |
+客户端连接期间独占一个后端连接 |
+需要过程内 COMMIT、完整会话特性 |
+
transaction |
+每个事务结束后归还连接 |
+最常用,连接复用率最高 |
+
statement |
+每条语句后归还连接 |
+限制最多,不支持显式事务 |
+
2. 安装
+| + + | ++源码测试安装环境为 Ubuntu 24.04。 + | +
2.1. 依赖
+# Ubuntu / Debian +sudo apt install libevent-dev libssl-dev pkg-config + +# RHEL / Rocky Linux +sudo dnf install libevent-devel openssl-devel pkgconfig+
3. 配置
+3.1. 连接 IvorySQL PG 模式(端口 5432)
+创建 /etc/pgbouncer/pgbouncer.ini:
[databases] +postgres = host=127.0.0.1 port=5432 dbname=postgres + +[pgbouncer] +listen_addr = 127.0.0.1 +listen_port = 6432 +auth_type = trust +auth_file = /etc/pgbouncer/userlist.txt +pool_mode = transaction +max_client_conn = 200 +default_pool_size = 20 +logfile = /var/log/pgbouncer/pgbouncer.log +pidfile = /var/run/pgbouncer/pgbouncer.pid+
3.2. 连接 IvorySQL Oracle 兼容模式(端口 1521)
+[databases] +postgres = host=127.0.0.1 port=1521 dbname=postgres + +[pgbouncer] +listen_addr = 127.0.0.1 +listen_port = 2521 +auth_type = trust +auth_file = /etc/pgbouncer/userlist.txt + +# Oracle 兼容模式建议使用 session 模式 +pool_mode = session + +max_client_conn = 200 +default_pool_size = 20 +logfile = /var/log/pgbouncer/pgbouncer_oracle.log +pidfile = /var/run/pgbouncer/pgbouncer_oracle.pid+
4. 使用
+4.1. 客户端连接
+通过 PgBouncer 连接与直连 IvorySQL 语法完全一致,只需修改端口:
+# PG 模式(经由 PgBouncer) +psql -U postgres -p 6432 -d postgres + +# Oracle 兼容模式(经由 PgBouncer) +psql -U postgres -p 2521 -d postgres+
4.2. 管理控制台
+PgBouncer 提供内置管理数据库:
+psql -U postgres -p 6432 -d pgbouncer+
-- 查看连接池状态 +SHOW POOLS; + +-- 查看统计信息 +SHOW STATS; + +-- 查看客户端连接 +SHOW CLIENTS; + +-- 查看后端连接 +SHOW SERVERS; + +-- 重载配置 +RELOAD;+
4.3. Oracle 兼容模式
+-- 确认 Oracle 模式已激活 +SHOW ivorysql.compatible_mode; +-- ivorysql.compatible_mode +-- -------------------------- +-- oracle + +-- Oracle 数据类型与函数 +CREATE TABLE bouncer_test ( + id NUMBER(10) PRIMARY KEY, + name VARCHAR2(100), + hired DATE DEFAULT SYSDATE +); + +INSERT INTO bouncer_test VALUES (1, 'Alice', SYSDATE); + +SELECT id, + NVL(name, 'N/A') AS name, + DECODE(id, 1, 'CEO', 'Staff') AS title, + TO_CHAR(hired, 'YYYY-MM-DD') AS hire_date +FROM bouncer_test; + +-- Oracle 序列 +CREATE SEQUENCE ora_seq START WITH 100 INCREMENT BY 10; +SELECT ora_seq.NEXTVAL FROM DUAL; -- 100 +SELECT ora_seq.NEXTVAL FROM DUAL; -- 110 +SELECT ora_seq.CURRVAL FROM DUAL; -- 110+