Swoole

Swoole协程MySQL连接池相关问题

12-12 16:13

官方文档

http://wiki.swoole.com/zh-cn/#/coroutine/conn_pool?id=connectionpool


官方文档对连接池有一定的说明,用法也做了案例说明,这里适当做一些补充


连接池是什么?

可以这样理解,创建好mysql的长连接,需要用时就获取一个连接,使用完了需要把这个连接还给池,等后面需要的再使用,这就需要用到文档中给出的 get 和 put 方法


创建mysql连接池,根据文档给出示例操作就可以

get获取连接时,可带 float 参数,表示获取连接的超时时间, 比如连接池变量是 $pool,获取连接时

$conn = $pool->get(10.0); //获取连接超时时间10s

通过这种设置,假设在几万次的循环中,通过协程连接池查询数据,连接池会迅速接近上限,还给池的连接会被马上分配给正在等待的,超过10秒没有结束,那么后面的查询将被强行结束,比如下面的代码:

此时如果做了判断,在控制台会看到抛出的错误

若在get获取连接时不加参数,结论时:程序将会执行完毕,但容易出现问题

比如,出现慢查,连接无法及时归还,会导致更过请求等待,负载飙升,数据库压力增大,更多慢查,恶性循环,极端情况下引发服务雪崩

$conn = $pool->get(); //get不带参数,理想情况下程序将会执行完毕

经验之谈是务必设置超时:在连接池实现中,获取连接 ($pool->get()) 必须设置超时参数,避免在池空时协程无限等待,导致死锁。


还有个注意事项,如果在每个协程中不向连接池归还连接,会快速(几秒钟)用光连接池中的连接,其它正在等在的将无连接可用,直到超时

若不向池中归还连接,并且也不设置get的超时时间,那么将在用光连接池中的连接后,进入无限等待


微信小程序
大潇博客 版权所有 Copyright ©2016~2026
京ICP备17004217号-6  合作QQ:284710375
天玺科技