swoole4創建Mysql連接池


一 .什么是mysql連接池
場景:每秒同時有1000個並發,但是這個mysql同時只能處理400個連接,mysql會宕機。
 
解決方案:連接池,這個連接池建立了200個和mysql的連接,這1000個並發就有順序的共享這連接池中的200個連接。
這個連接池能夠帶來額外的性能提升,因為這個和mysql建立連接的這個過程消耗較大,使用連接池只需連接一次mysql。
 
連接池定義:永不斷開,要求我們的這個程序是一個常駐內存的程序。數據庫連接池(Connection pooling)是程序啟
動時建立足夠的數據庫連接,並將這些連接組成一個連接池,由程序動態地對池中的連接進行申請,使用,釋放。
 
二.小案例
查找用戶表數據庫最新注冊的3個會員?
(1)小提示
show processlist #mysql查看連接數
(2)創建10個mysql連接示例代碼
<?php
/**
 * Created by PhpStorm.
 * User: Luke
 * Date: 2019/10/30
 * Time: 14:12
 */
//編寫mysql連接池,這個類只能被實例化一次(單例)
class MysqlConnectionPool
{
    private static $instance;//單例對象
    private $connection_num = 10;//連接數量
    private $connection_obj = [];
 
    //構造方法連接mysql,創建20mysql連接
    private function __construct()
    {
        for($i=0;$i<$this->connection_num;$i++){
            $dsn = "mysql:host=127.0.0.1;dbnane=swoole";
            $this->connection_obj[] =  new Pdo($dsn,'root','rootmysql123');
        }
    }
    private function __clone()
    {
        // TODO: Implement __clone() method.
    }
    public static function getInstance()
    {
        if(is_null(self::$instance)){
            self::$instance = new self();
        }
    }
}
MysqlConnectionPool::getInstance();
//創建swool的http服務器對象
$serv = new swoole_http_server('0.0.0.0',8000);
//當瀏覽器鏈接點這個http服務器的時候,向瀏覽器發送helloworld
$serv->on('request', function($request,$response){
    //$request包含這個請求的所有信息,比如參數
    //$response包含返回給瀏覽器的所有信息,比如helloworld
 
    //(2.3)向瀏覽器發送helloworld
    $response->end("hello world");
});
//啟動http服務器
$serv->start();
(3)效果
(4)完善mysql連接池
<?php
/**
 * Created by PhpStorm.
 * User: Luke
 * Date: 2019/10/30
 * Time: 14:12
 */
//編寫mysql連接池,這個類只能被實例化一次(單例)
class MysqlConnectionPool
{
    private static $instance;//單例對象
    private $connection_num = 20;//連接數量
    private $connection_obj = [];
    private $avil_connection_num = 20;//可用連接
 
    //構造方法連接mysql,創建20mysql連接
    private function __construct()
    {
        for($i=0;$i<$this->connection_num;$i++){
            $dsn = "mysql:host=127.0.0.1;dbname=swoole";
            $this->connection_obj[] =  new Pdo($dsn,'root','rootmysql123');
        }
    }
    private function __clone()
    {
        // TODO: Implement __clone() method.
    }
    public static function getInstance()
    {
        if(is_null(self::$instance)){
            self::$instance = new self();
        }
        return self::$instance;
    }
 
    //執行sql操作
    public function query($sql)
    {
        if($this->avil_connection_num==0){
            throw new Exception("暫時沒有可用的連接誒,請稍后");
        }
        //執行sql語句
        $pdo = array_pop($this->connection_obj);
        //可用連接數減1
        $this->avil_connection_num --;
        //使用從連接池中取出的mysql連接執行查詢,並且把數據取成關聯數組
        $rows = $pdo->query($sql)->fetchAll(PDO::FETCH_ASSOC);
        //把mysql連接放回連接池,可用連接數+1
        array_push($this->connection_obj,$pdo);
        $this->avil_connection_num ++;
        return $rows;
    }
}
//創建swool的http服務器對象
$serv = new swoole_http_server('0.0.0.0',8000);
//當瀏覽器鏈接點這個http服務器的時候,向瀏覽器發送helloworld
$serv->on('request', function($request,$response){
    //$request包含這個請求的所有信息,比如參數
    //$response包含返回給瀏覽器的所有信息,比如helloworld
    //向瀏覽器發送helloworld
    $stop = false;
    while (!$stop){
        try{
            $sql = "SELECT * FROM user ORDER BY id  DESC LIMIT 5";
            $rows = MysqlConnectionPool::getInstance()->query($sql);
            $response->end(json_encode($rows));
            $stop = true;
        }catch (Exception $e){
            usleep(100000);
        }
    }
 
});
//啟動http服務器
$serv->start();


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM