[ PROMPT_NODE_23510 ]
conn-pooling
[ SKILL_DOCUMENTATION ]
## 在所有应用中使用连接池
Postgres 连接非常昂贵(每个占用 1-3MB 内存)。如果没有连接池,应用在高负载下会耗尽连接。
**错误做法(每个请求创建一个新连接):**
sql
-- 每个请求创建一个新连接
-- 应用代码: 每个请求执行 db.connect()
-- 结果: 500 个并发用户 = 500 个连接 = 数据库崩溃
-- 检查当前连接
select count(*) from pg_stat_activity; -- 487 个连接!
**正确做法(使用连接池):**
sql
-- 在应用和数据库之间使用像 PgBouncer 这样的连接池
-- 应用连接到连接池,连接池重用一小部分连接到 Postgres
-- 根据以下公式配置 pool_size: (CPU 核心数 * 2) + 磁盘数
-- 4 核 CPU 示例: pool_size = 10
-- 结果: 500 个并发用户共享 10 个实际连接
select count(*) from pg_stat_activity; -- 10 个连接
连接池模式:
- **事务模式 (Transaction mode)**:每个事务后归还连接(最适合大多数应用)
- **会话模式 (Session mode)**:整个会话期间保持连接(预处理语句、临时表需要此模式)
参考:[连接池](https://supabase.com/docs/guides/database/connecting-to-postgres#connection-pooler)