mysql连接池_拥抱swoole(六)用php实现数据库连接池

bb5c1ebf080029d614c2ddc189f74e38.png

因为传统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的负载。


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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值