编程学习网 > PHP技术 > swoole > 一文教你如何使用swoole实现数据库连接池,不再被同行嘲笑
2021
08-04

一文教你如何使用swoole实现数据库连接池,不再被同行嘲笑

因为传统php框架,没有数据库连接池,不知道被嘲笑了多少次,包括很多团队内部,因为没有数据库连接池,被java团队给挤掉。这次我们就聊一聊如何用swoole,实现数据库连接池。


为什么要创建数据库连接池?

连接池是可以有效降低MySQL-Server负载的。原理是 连接池使用一个共享资源的模式,如并发100个请求,实际上并不是每个请求的所有时间都在执行SQL查询。这样100个请求,共享20个MySQL连接就可以满足需求了。当一个请求操作完数据库后,开始进入模板渲染等流程,这时就会释放数据库连接给其他的请求使用。


连接池仅在超大型应用中才有价值。普通的应用采用MySQL长连接方案,每个php-fpm创建一个MySQL连接,每台机器开启100个php-fpm进程。如果有10台机器,每台机器并发的请求为100。实际上只需要创建1000个MySQL连接就能满足需求,数据库的压力并不大。即使有100台机器,硬件配置好的存储服务器依然可以承受。


达到数百或者数千台应用服务器时,MySQL服务器就需要维持十万级的连接。这时数据库的压力就会非常大了。连接池技术就可以派上用场了,可以大大降低数据库连接数。


如何实现?

1 同步阻塞模式


可基于swoole的AsyncTask模块实现的连接池,编程简单,没有数据同步和锁的问题。甚至可以多个服务共享连接池。缺点是: 1. 灵活性不如多线程连接池,无法动态增减连接 2. 有一次进程间通信的开销


2 协程模式


可使用channel实现连接池。


我个人推荐使用协程模式,使用协程效率高。


如果用协程实现?

实现原理,其实swoole也有类似go语言的channel,我们实例化一定数量的mysql的pdo连接,然后把pdo连接放到channel里面,channel支持push和pop,channel是作用域是在整个进程,所以在一个进程中,如果channel已经为空,就得等待其它协程释放连接资源,否则就会挂起。


长时间不用的连接要定时释放

可以在进程中,通过一个定时器,检查每次连接的上次使用时间,如果已经过期,就释放掉,从而减轻mysql的负载。


大家可以动手试一试,明白了道理后,其实很简单的。

以上就是“一文教你如何使用swoole实现数据库连接池,不再被同行嘲笑”的详细内容,想要获取更多swoole教程欢迎关注编程学习网


扫码二维码 获取免费视频学习资料

Python编程学习

查 看2022高级编程视频教程免费获取