答案:Swoole中MySQL连接池通过协程实现连接复用,需在onWorkerStart初始化,使用队列管理空闲连接,获取时检查有效性,用后归还而非关闭,防止泄漏并处理超时与异常,推荐用Channel替代SplQueue提升稳定性。

启用协程支持并创建连接池
Swoole的MySQL连接池依赖协程运行,需确保开启了协程环境。通过Swoole\Coroutine\MySQL实现连接管理,使用队列保存空闲连接。
一个基础的连接池类可以这样设计:
- 初始化时设定最大连接数(如100)
- 使用
SplQueue存储可用连接 - 获取连接时优先从队列取用,无则新建
- 用完连接不关闭,而是归还到队列
连接的获取与释放
每次处理请求前调用getConnection()方法,内部判断是否有空闲连接。如果有,出队并返回;否则创建新连接。注意设置超时防止死等。
执行SQL后必须调用releaseConnection(),将连接重新入队。不能直接调用close(),否则连接丢失。
示例流程:
- 协程启动 → 调用
get() - 成功获取连接 → 执行查询
- 查询结束 → 调用
put()归还
处理连接异常与超时
长时间运行的服务可能遇到MySQL断连。建议在获取连接时检测ping()状态,失效则重建。
每个连接可记录最后使用时间,定期清理超过生命周期的连接(如闲置5分钟以上)。
关键点:
- 捕获MySQL错误码2006、2013等网络异常
- 设置合理的
connect_timeout和timeout - 归还前检查连接是否仍可用
配合Swoole Server生命周期管理
在onWorkerStart中初始化连接池,每个工作进程独立维护自己的池子,避免跨进程共享。
不要在onReceive里创建新池,会导致重复实例化。可通过全局变量或依赖注入传递池对象。
关闭服务时可在onWorkerStop中清理所有连接,确保资源释放。
基本上就这些。核心是复用连接、及时归还、防泄漏、处理异常。官方也推荐使用swoole/library中的Channel替代SplQueue做连接队列,更稳定高效。










