服务器之家:专注于服务器技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|

服务器之家 - 数据库 - Mysql - workerman写mysql连接池的实例代码

workerman写mysql连接池的实例代码

2021-01-03 17:41 Mysql

在本篇文章中小编给大家分享的是一篇关于workerman写mysql连接池的实例代码内容,有需要的朋友们可以参考下。

首先要了解为什么用连接池,连接池能为你解决什么问题

连接池主要的作用:

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:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 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中调用:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
use \Workerman\Connection\AsyncTcpConnection;
 
 
 
// 与远程连接池服务建立异步链接,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连接池全部知识点,有任何补充可以联系服务器之家小编。

原文链接:https://www.php.cn/workerman/441718.html

延伸 · 阅读

精彩推荐
  • Mysql实现数据库水平切分的两个思路

    实现数据库水平切分的两个思路

    今天小编就为大家分享一篇关于实现数据库水平切分的两个思路,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小...

    CODETC3982020-09-15
  • MysqlMySQL 消除重复行的一些方法

    MySQL 消除重复行的一些方法

    这篇文章主要介绍了MySQL 消除重复行的一些方法,需要的朋友可以参考下...

    feixianxxx3792020-07-28
  • MysqlMySQL中datetime和timestamp的区别及使用详解

    MySQL中datetime和timestamp的区别及使用详解

    这篇文章主要介绍了MySQL中datetime和timestamp的区别及使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的...

    iVictor3862020-12-18
  • MysqlMySQL学习第三天 Windows 64位操作系统下验证MySQL

    MySQL学习第三天 Windows 64位操作系统下验证MySQL

    MySQL学习第三天教大家如何在Windows 64位操作系统下验证MySQL,感兴趣的小伙伴们可以参考一下...

    丿木呈广予口贝4362020-06-11
  • MysqlMysql的水平分表与垂直分表的讲解

    Mysql的水平分表与垂直分表的讲解

    今天小编就为大家分享一篇关于Mysql的水平分表与垂直分表的讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随...

    DreamBoyMrsLin3382020-09-13
  • MysqlCentOS 7中源码安装MySQL 5.7.6+详细教程

    CentOS 7中源码安装MySQL 5.7.6+详细教程

    最近在CentOS 7中源码安装MySQL 5.7.6+,发现MySQL5.7.6+以后的安装方式真的与以前版本的MySQL安装方式大大的不同呀。不自己安装一把,你都不知道不同之处在哪...

    daisy3712020-07-05
  • Mysqlmysql分区功能详解,以及实例分析

    mysql分区功能详解,以及实例分析

    下面小编就为大家带来一篇mysql分区功能详解,以及实例分析。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    jingxian3772020-07-23
  • MysqlMySQL数据库中的安全设置方案

    MySQL数据库中的安全设置方案

    MySQL 是一个真正的多用户、多线程SQL数据库服务器,它是一个客户机/服务器结构的实现。MySQL是现在流行的关系数据库中其中的一种,相比其它的数据库管...

    MYSQL教程网3212020-05-04