网站连接数据库配置如何优化?数据库连接池设置?
一、核心优化方向
- 减少连接开销:避免频繁建立/断开连接
- 合理复用连接:平衡并发数与服务器资源
- 预防连接泄漏:确保及时释放资源
二、基础配置优化(以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