网站连接数据库配置如何优化?数据库连接池设置?
一、核心优化方向
- 减少连接开销:避免频繁建立/断开连接
- 合理复用连接:平衡并发数与服务器资源
- 预防连接泄漏:确保及时释放资源
二、基础配置优化(以MySQL为例)
1. 基础参数调整
ini
; php.ini 关键配置 mysqli.max_links = 200 ; 最大连接数限制 mysqli.reconnect = Off ; 禁用自动重连(建议配合重试机制) pdo_mysql.default_socket = /tmp/mysql.sock ; 减少TCP连接开销2. PHP持久连接优化
php
// 使用mysqli持久连接(注意:需配合进程管理) $db = new mysqli('p:localhost', 'user', 'pass', 'db'); // 前缀"p:"表示持久连接- 持久连接需与PHP-FPM的
pm.max_children匹配 - Apache环境下谨慎使用(可能引发连接堆积)
三、连接池方案对比
| 方案 | 原理 | 适用场景 | 特点 |
|---|---|---|---|
| Swoole连接池 | 常驻内存+协程管理 | 高并发长连接场景 | 需安装扩展,性能最佳 |
| PgBouncer | 轻量级中间件 | PostgreSQL专用 | 支持事务/会话模式切换 |
| MySQL Router | 官方中间件 | MySQL读写分离 | 自动负载均衡 |
| PHP手工池 | 静态变量存储连接实例 | 简单小规模应用 | 无扩展依赖但功能有限 |
四、Swoole连接池实现示例
php
$pool = new Swoole\ConnectionPool( function() { return new PDO('mysql:host=127.0.0.1;dbname=test', 'user', 'pass'); }, 100 // 连接池容量 ); // 获取连接 $pdo = $pool->get(); try { $stmt = $pdo->query('SELECT * FROM users'); // ...业务操作 } finally { $pool->put($pdo); // 归还连接 }五、关键参数计算公式
- 连接池大小估算:
建议值 = (核心线程数) × (每个请求平均DB查询次数) × 1.2- 例如:4核CPU,每次请求3次查询 →
4×3×1.2≈15
- 例如:4核CPU,每次请求3次查询 →
- 超时设置原则:
- 连接超时(connect_timeout)< 网络延时×2
- 查询超时(wait_timeout)> 95%查询耗时
六、生产环境建议
- 监控指标:
SHOW STATUS LIKE 'Threads_connected'(MySQL)- PHP-FPM的
slow requests日志
- 熔断机制:
php
// 伪代码示例 if ($current_connections > $max_threshold) { throw new DBOverloadException(); } - 优雅降级:
- 连接失败时启用缓存数据
- 队列化非紧急写操作
📌 特别提醒
- 连接池需配合
pm.max_children(PHP-FPM)或worker_num(Swoole)调整- 云数据库注意账号连接数配额(如RDS默认最多1200连接)

更新时间:2025-06-02 14:11:37
