加入收藏 | 设为首页 | 会员中心 | 我要投稿 应用网_丽江站长网 (http://www.0888zz.com/)- 科技、建站、数据工具、云上网络、机器学习!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

workerman编辑mysql连接池的实例代码

发布时间:2022-03-15 03:17:15 所属栏目:MySql教程 来源:互联网
导读:要了解为什么用连接池,连接池能为你解决什么问题 连接池主要的作用: 1、减少与数据服务器建立TCP连接三次握手及连接关闭四次挥手的开销,从而降低客户端和mysql服务端的负载,缩短请求响应时间 2、减少数据库的并发连接数,即解决应用服务器过多导致的数
      要了解为什么用连接池,连接池能为你解决什么问题
 
连接池主要的作用:
 
     1、减少与数据服务器建立TCP连接三次握手及连接关闭四次挥手的开销,从而降低客户端和mysql服务端的负载,缩短请求响应时间
 
     2、减少数据库的并发连接数,即解决应用服务器过多导致的数据库 too many connections 问题
 
如果是为了解决问题1
 
     则在workerman中数据库连接池不是最高效的方法,反而是自找麻烦的做法。由于PHP是单进程单线程的,使用PHP实现数据库连接池,肯定需要用单独的进程去做,那么就会涉及到进程间的通讯,使得原本和mysql直接通讯的过程变成 与连接池再到mysql的通讯,增加了应用端的负载。
 
     解决问题1最高效的方法是为每个业务进程建立一个数据库单例(例如workerman提供的DB类),实现数据库长连接,这样每个进程的所有请求都使用自己的这一个数据库长连接,整个进程的生命周期只有一次TCP握手和断开连接挥手的开销,并且应用与mysql直接通讯,没有连接池那样中间一层进程间IPC通讯,性能是最高的,没有之一。
 
如果是为了问题2
 
首先看下自己到底有多少台应用服务器,每台服务器与mysql有多收并发连接。假如你只有10台应用服务器,每个服务器50个进程,每个进程1个数据库连接,那么到mysql服务端总共只有10*50=500个并发连接(并非活跃连接),500个并发连接对于mysql来说就是小菜一碟,为了解决问题2完全没有使用连接池的必要。
 
假如你有1000台应用服务器,那么连接池是有必要的,但是这个连接池不能是运行在本地应用服务器上的连接池,因为1000台应用服务器就有1000个连接池,即使每个连接池只开10个连接,那么数据库的连接数也会轻松打满。所以不要指望在当前服务器上开几个task进程实现的连接池就能解决这个问题。
 
1000台应用服务器的集群,每台服务器上搞几个进程实现连接池同样是不靠谱的方法。真正能够解决问题2的方法是建立一个独立的数据库连接池服务器或者说集群,全局管理所有的数据库链接。
 
综上所述,
 
如果单独是为了问题1实现php的mysql连接池,那么数据库单例是比所谓的连接池更简单更高效的做法。
 
如果是为了实现问题2,那么想必业务也有一定的规模了,如果真心是想用workerman做个单独的连接池集群,下面是大概简单的做法,建立一些task进程,每个进程创建一个数据库连接,task进程收到sql请求后发送给mysql服务器,mysql服务器返回后task进程再把结果发给sql发起者。
 
连接池代码类似如下 如果是多台服务器组成的连接池集群,前面最好加一个lvs:
 
// task worker,使用Text协议
 
$task_worker = new Worker('Text://0.0.0.0:1234');
 
$task_worker->count = 64;
 
$task_worker->name = 'MysqlTask';
 
$task_worker->onMessage = function($connection, $sql)
 
{
 
   // 执行sql.... 得到结果,这里省略....
 
   $sql_result = your_mysql_query($sql);
 
   // 发送结果
 
   $connection->send(json_encode($sql_result));
 
};
在workerman中调用:
 
use WorkermanConnectionAsyncTcpConnection;
 
 
 
// 与远程连接池服务建立异步链接,ip为远程连接池服务的ip,如果是集群就是lvs的ip
 
$sql_connection = new AsyncTcpConnection('Text://ip:1234');
 
// 发送sql
 
$sql_connection->send("SELECT ... FROM .....");
 
// 异步获得sql结果
 
$sql_connection->onMessage = function($sql_connection, $sql_result)
 
{
 
   // 这里只是打印结果
 
   var_dump(json_decode($task_result));
 
};
 
// 执行异步链接
 
$sql_connection->connect();
以上就是本次介绍的workerman写mysql连接池全部知识点。

(编辑:应用网_丽江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读