学习目标:
理解什么是mysql连接池,以及mysql利用场景。能在实际事情利用连接池(数据库连接池,redis连接池等等)办理高并发带来的问题。
场景:

每秒同时1000个并发,但mysql数据库同时只支持400个连接,这样mysql就会宕机办理方案:
利用连接池,这个连接池建立了300个与mysql的连接工具,这1000个并发有序地共享连接池里的300个连接。
连接池的利用不但办理了mysql在高并发情形下宕机问题,还额外提高了性能。由于和mysql建立连接,花费较大。利用连接池只须要连接一次mysql。
连接池定义永不断开,须要程序常驻内存,这就须要借助swoole实现。
数据库连接池是程序启动时,建立足够的数据库连接,并将这些连接组成一个连接。由程序动态的对连接池中的连接进行申请,利用,开释和回补。
查看当前mysql连接数show processlist
创建连接池代码示例
/ MYSQL连接池,这个类只能被实例化一次(单例模式) Class MysqlConnectionPool /class MysqlConnectionPool{ / 单例工具 @var MysqlConnectionPool / private static $instance; / 连接池连接数量 @var int / private $connNum = 20; / 连接工具列表,即连接池工具列表 @var array / private $connObjList = []; / 可用连接数 @var int / private $avilaConnNum = 20; / 布局方法连接mysql,创建20mysql连接 MysqlConnectionPool constructor. / private function __construct() { for($i=0; $i<$this->connNum; $i++){ $dsn = "mysql:host=127.0.0.1;dbname=test"; $this->connObjList[] = new Pdo($dsn,'root','123456'); } } private function __clone() { } / 获取连接池工具,单例 @return MysqlConnectionPool / public static function getInstance() { if(is_null(self::$instance)){ self::$instance = new self(); } return self::$instance; } //实行sql操作 public function query($sql) { if($this->avilaConnNum < 1){ throw new Exception("暂时没有可用的连接诶,请稍后"); } //从连接池获取一个连接工具,并删除(array_pop) $pdo = array_pop($this->connObjList); //可用连接数减1 $this->avilaConnNum --; //利用从连接池中取出的mysql连接实行查询,并且把数据取成关联数组 $rows = $pdo->query($sql)->fetchAll(PDO::FETCH_ASSOC); //把mysql连接放回连接池,可用连接数+1 array_push($this->connObjList,$pdo); $this->avilaConnNum ++; return $rows; }}
swoole中利用连接池工具
/创建swoole的http做事器工具$serv = new swoole_http_server('0.0.0.0',8080);//当浏览器链接点这个http做事器的时候,向浏览器发送helloworld$serv->on('request', function($request,$response){ $sql = "SELECT xxx";//实际查询的sql语句 $rows = MysqlConnectionPool::getInstance()->query($sql); $response->end(json_encode($rows));});//启动http做事器$serv->start();
php7进阶到架构师干系阅读
https://www.kancloud.cn/gofor/gofor
末了,欢迎大家留言补充,谈论~~~喜好小编的话,欢迎点赞、收藏和关注哦~~~///(^v^)\\\~~~