MySQL连接池

在传统的网站开发中,比如LNMP模式,由Nginx的master进程接收请求然后分给多个worker进程,每个worker进程再链接php-fpm的master进程,php-fpm再根据当前情况去调用其worker进程然后处理PHP,如果需要MySQL,在与MySQL建立连接,这个时候,如果有1000个请求打过来,就需要与MySQL建立1000个连接。如果请求达到万级或者百万级,这时数据库的压力就会非常大了。连接池技术就可以派上用场了,可以大大降低数据库连接数,还可以降低IO消耗。

为什么可以降低IO消耗?

MySQL短连接每次请求操作数据库都需要建立与MySQL服务器建立TCP连接,这是需要时间开销的。TCP连接需要3次网络通信。这样就增加了一定的延时和额外的IO消耗。请求结束后会关闭MySQL连接,还会发生3/4次网络通信。

而连接池采用的是MySQL的长连接模式,会一直保持与MySQL的连接,重用连接进行MySQL的操作,从而节省了建立连接和断开连接的消耗。

为什么可以降低数据连接数呢?

据的连接池为维持若干个长连接,当新请求到达的时候,如果连接池空闲,就分配给连接池去处理,否则,后面的数据库连接请求将被加入到等待队列中。

用swoole实现一个简单的MySQL连接池

$serv = new swoole_server('0.0.0.0', 9509);

$serv->set(array(

'worker_num' => 50, //worker进程数量

'task_worker_num' => 10, //task进程数量 即为维持的MySQL连接的数量

));

function my_onReceive($serv, $fd, $from_id, $data)

{

echo "收到数据".$data.PHP_EOL;

//taskwait就是投递一条任务,这里直接传递SQL语句了

//然后阻塞等待SQL完成,并返回结果

$result = $serv->taskwait($data);

echo "任务结束".PHP_EOL;

if ($result !== false) {

list($status, $db_res) = explode(':', $result, 2);

if ($status == 'OK') {

//数据库操作成功了,执行业务逻辑代码,这里就自动释放掉MySQL连接的占用

//将处理结果发送给客户端

$serv->send($fd, var_export(unserialize($db_res), true) . "\n");

} else {

$serv->send($fd, $db_res);

}

return;

} else {

$serv->send($fd, "Error. Task timeout\n");//如果返回的是false,则说明taskwait等待超时,可以设置相应的等待超时时间

}

}

function my_onTask($serv, $task_id, $from_id, $sql)

{

echo "开始做任务 task id:".$task_id.PHP_EOL;

static $link = null;

HELL:

if ($link == null) {

$link = @mysqli_connect("127.0.0.1", "root", "passwd", "database");

if (!$link) {

$link = null;

$serv->finish("ER:" . mysqli_error($link));

return;

}

}

$result = $link->query($sql);

if (!$result) { //如果查询失败了

if(in_array(mysqli_errno($link), [2013, 2006])){//错误码为2013,或者2006,则重连数据库,重新执行sql

$link = null;

goto HELL;

}else{

$serv->finish("ER:" . mysqli_error($link));

return;

}

}

if(preg_match("/^select/i", $sql)){//如果是select操作,就返回关联数组

$data = $result->fetch_assoc();

}else{//否则直接返回结果

$data = $result;

}

$serv->finish("OK:" . serialize($data));//调用finish方法,用于在task进程中通知worker进程,投递的任务已完成

//return "OK:".serialize($data);

}

function my_onFinish($serv, $task_id, $data)

{

echo "任务完成";//taskwait 没有触发这个函数。。

echo "AsyncTask Finish:Connect.PID=" . posix_getpid() . PHP_EOL;

}

$serv->on('receive', 'my_onReceive');

$serv->on('task', 'my_onTask');

$serv->on('Finish', 'my_onFinish');

$serv->start();//启动server

swoole mysql 连接数_用swoole简单实现MySQL连接池相关推荐

  1. 查询计算机系学生的详细记录,实验三_数据库的简单查询和连接_.doc

    实验三_数据库的简单查询和连接_ 实验三 数据库的简单查询和连接查询 实验目的及要求 掌握SELECT语句的基本语法: 熟练掌握表的数据简单查询.数据排序: 熟练掌握表的连接查询的表示: 掌握等值连接 ...

  2. mysql 连接查询_Swoole 实战:MySQL 查询器的实现(协程连接池)

    Swoole 实战:MySQL 查询器的实现(协程连接池) 需求分析 本篇我们将通过 Swoole 实现一个自带连接池的 MySQL 查询器: 1. 支持通过链式调用构造并执行 SQL 语句: 2. ...

  3. 怎么看mysql的最大连接数_怎么查看和修改 MySQL 的最大连接数?

    MySQL 默认的最大连接数为 100,可以在 mysql 客户端使用以下命令查看 mysql> show variables like '%connections'; 此命令将得到类似以下的输 ...

  4. 查看mysql连接数_查看mysql 连接数

    1.查看当前所有连接的详细资料: mysqladmin -uroot -proot processlist D:\MySQL\bin > mysqladmin - uroot - proot p ...

  5. php查看mysql连接数_查看mysql当前连接数

    1.查看当前所有连接的详细资料: mysqladmin -uroot -proot processlist D:\MySQL\bin>mysqladmin -uroot -proot proce ...

  6. 宝塔mysql优化_宝塔面板下实现MySQL性能优化处理

    在PHP+MYSQL架构网站运行过程中,往往会遇到各种性能问题影响,如MySQL.PHP.CPU.磁盘IO.缓存等,其中MySQL瓶颈就是最常见也最难解决的一种影响网站性能的因素:通常,我们会使用re ...

  7. linux mysql怎么样_最强Linux和Mysql面试题套餐,让你的面试无懈可击!

    引言: 大家好,我是一菲,在软件测试当中linux 操作系统和Mysql数据库的内容是十分的知识同时也是十分重要的.所以一菲这两天通过查阅资料等其他方式为大家梳理了liunx和Mysql面试题大礼包, ...

  8. java读取mysql配置文件_一文读懂 MySQL 主从复制读写分离

    文章已收录Github精选,欢迎Star:https://github.com/yehongzhi/learningSummary 前言 在很多项目,特别是互联网项目,在使用MySQL时都会采用主从复 ...

  9. mysql 换行_教你如何用Python 连接 MySQL

    Hello,大家好,欢迎来到每周的Python小课堂,今天我们一起来聊聊如何用Python连接数据库. 一.普通 MySQL 连接方法 使用模块 MySQLdb 普通方式连接. execute() 返 ...

最新文章

  1. 分享:手把手教你如何免费且光荣地使用正版IntelliJ IDEA
  2. 如何兼容並蓄Android Studio 與 Eclipse 的優點, 減少顧此失彼的缺憾
  3. Flink JAR包上传和运行逻辑
  4. Eclipse中写jsp文件时,发现里面加载不了js文件和css文件(解决css文件在eclipse中显示不了)
  5. 我在工作中是如何使用Git的
  6. java velocity是什么意思_基于 Java 的模板引擎Velocity快速入门
  7. mysql模糊查询 or_mysql的模糊查询
  8. 2015-2020年各类国际会议与期刊基于图像的三维对象重建论文综述(3)——Volumetric decoding
  9. 用express搭建网站
  10. IIS HTTP 500 内部服务器错误
  11. LayoutInflater拦截View创建,自定义Resource对象
  12. Oracle数据库安装与配置
  13. 2013 Esri全球用户大会QA之元数据支持
  14. 【音乐可视化】音乐表演可视化软件分析
  15. 非线性方程求解 matlab,MATLAB应用 求解非线性方程
  16. 关于计算机的病毒案例分析,实例解析蠕虫病毒的原理 -电脑资料
  17. Excel 和Word 常用小技巧
  18. 海信100E8K和TCL 98Q10GPRO选哪个好
  19. 第18节 渗透测试流程和简单案例
  20. 嵌入式系统自动化测试工具

热门文章

  1. html php上传图片验证判断,HTML_PHP实例:上传多个图片并校验的代码,单张的图片上传是不复杂的, - phpStudy...
  2. 【笔记】JAVA SE
  3. 关于quick-cocos2d-x
  4. JVM02----垃圾收集上(堆)
  5. python的特殊方法介绍
  6. C++中的.和::和:和-的区别
  7. 计算MACD(指数平滑移动平均线)Moving Average Convergence / Divergence
  8. ASP.NET MVC中的ActionResult--总结
  9. libquickmail 0.1.6 发布,邮件发送包
  10. 基于Tiles框架Struts框架的UI 设计—几种组织HTML和JSP视图组件