问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Workerman 怎样连接到mysql数据库查询数据

发布网友 发布时间:2022-04-29 09:20

我来回答

2个回答

懂视网 时间:2022-04-29 13:42

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

连接池主要的作用:

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知识请关注PHP中文网workerman教程栏目。

热心网友 时间:2022-04-29 10:50

安装
npm install mysql@2.0.0-alpha6

示例
var mysql = require('mysql');
var connection = mysql.createConnection({
host : 'localhost',
user : 'me',
password : 'secret',
});
connection.connect();
connection.query('SELECT 1 + 1 AS solution', function(err, rows, fields) {
if (err) throw err;
console.log('The solution is: ', rows[0].solution);
});
connection.end();
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
cad里面打完字怎么还原十字架 财务建帐需要什么 建账建账的基本要求 当爱情与亲情需要丢弃一样时,你会选择丢弃哪一方 当爱情和亲情有冲突时你会怎样决择?你会为你所爱的人不顾一切吗? 剑网三 查看余额 因为某些特殊原因不好登陆游戏查看,求其他方式_百度知 ... 右肺上叶中叶结节灶怎么回事 节能门窗有哪些标准 节能门窗有哪些 节能门窗具有哪些特征 激光电视支持无线投屏吗? 明基激光电视投屏没声音 海信激光电视80GL1可以和手机联吗 激光电视能投屏吗 海信激光电视能电脑投屏 飞利浦GC9682如何去除水垢 科技布沙发改色最简单的方法 https有一横说证书已过期,请问是怎么回事情? 当GlobalSign https证书到期后,怎么更换? 电线破皮了还能用吗 墙里的电源线被打破皮该怎么绝缘 地面电线管道破损该如何修复 电线的外皮脱落了露出电线了怎么弄啊? 潜水电机电缆破皮后怎样处理 低压电缆破皮了,要怎么处理。里面的绝缘皮都破了,但是铜丝一股都没断?急!急!急! 电缆线埋土里施工时损坏破皮了怎么办 藉和籍怎么组词? 插座的线破了点皮,应该没有关系吧因为时间很久了。 藉怎么拼读?怎么组词? 七十平方的电线破皮漏电了,用什么方法处理之后这根电线可以长时间浸泡在水里面通电。而且不会,在漏电。 激光电视与投屏没有完全贴合怎么回事 小米激光电视如何与手机画面同步? 海信全色激光电视75L9一秒投屏是指什么? 小米激光电视怎么登录 JAVA中有哪些保留字? 激光电视怎么投影啊?可以直接投影在墙上吗? java开发的关键字有哪些? 小米激光电视支持无线投屏吗 上网课如何巧妙拒绝老师连麦请求? 学Java编程需要记住哪些关键词? JAVA中的关键字和保留字 逸枝源微循环沙棘肽对肺心有好处吗? 花家部落的沙棘蛋白酶有什么功效呢? _澡粉 沙棘茶 臻萃舒 高纤粉 是干嘛的 完美肽藻粉功效和作用是什么? 净通元的功效与作用? 提高免疫力吃什么好? 维生素A、维生素C的作用 完美玉肽片胃溃疡能不能吃 腾讯课堂连麦电脑要求佩戴耳机,手机耳机行吗?