分析easyswoole3.0源码,协程连接池(五)
连接池的含义,很多都知道,比如mysql的数据库连接是有限的,一开始连接mysql创建N个连接,放到一个容器里,每次有请求去容器中取出,取出用完再放回去。
es3demo里,有mysql的连接池。
EasySwooleEvent::30行,执行initialize方法会注册一个MysqlPool::class MysqlPool是继承于AbstractPool的只实现了createObject方法来创建mysql连接对象 AbstractPool这个抽象类,里我们分析下2个函数getObj和recycleObj。
EasySwoole\Component\Pool\AbstractPool::35和57行
getObj函数,当协程的chan还是空的时候不一定指的是初始化,可能是连接池的mysql连接都被用光了还没被回收,举个例子,如果我的连接池容量是10,现在10个用户同时访问我,我从连接池取出了10个现在连接池空了,等10个人随便某人用完了回收,连接池又不空了。这样就能理解为什么还
要判断当前创建的数量是否大于连接池容量。如果没有大于说明现在还可以继续往容器里防止连接对象而不会溢出连接池容量。其他情况就直接尝试从chan取出连接池对象。如果获取失败也是允许的。并发场景下获取不到连接池能容忍。
public function getObj(float $timeout = 0.1)
{
//懒惰创建模式
$obj = null;
if($this->chan->isEmpty()){
//如果还没有达到最大连接数,则尝试进行创建
if($this->createdNum < $this->max){
$this->createdNum++;
$obj = $this->createObject();
if(!is_object($obj)){
$this->createdNum--;
//创建失败,同样进入调度等待
$obj = $this->chan->pop($timeout);
}
}else{
$obj = $this->chan->pop($timeout);
}
}else{
$obj = $this->chan->pop($timeout);
}
//对对象进行标记处理
if(is_object($obj)){
$key = spl_object_hash($obj);
//标记这个对象已经出队列了
$this->objHash[$key] = true;
$obj->last_use_time = time();
return $obj;
}else{
return null;
}
}
回收的话就简单了,把获取到连接池对象塞回去chan->push
public function recycleObj($obj):bool
{
if(is_object($obj)){
//防止一个对象被重复入队列。
$key = spl_object_hash($obj);
if(isset($this->objHash[$key])){
//标记这个对象已经入队列了
unset($this->objHash[$key]);
if($obj instanceof PoolObjectInterface){
$obj->objectRestore();
}
$obj->last_recycle_time = time();
$this->chan->push($obj);
return true;
}else{
return false;
}
}else{
return false;
}
}
示例demo是这样调用的
App\HttpController\Api1构造方法会去从连接池里获取数据库连接,然后afterAction会去调用recycleObject进行回收。
分析easyswoole3.0源码,协程连接池(五)的更多相关文章
- 分析easyswoole3.0源码,服务启动为例(二)
以下内容需要结合es的源码,不然可能会觉得跳跃.先描述下es启动的大致流程.es启动的时候注册异常处理函数以及加载配置文件.根据位置文件的设置选择启动哪种swoole服务.然后用一个事件注册类,注册s ...
- 分析easyswoole3.0源码,consoleTcpService(六)
前文讲过可以通过配置开启一个tcp服务,叫做consoleTcpservice.EasySwoole\EasySwoole\Core::83行 (new TcpService(Config::getI ...
- 分析easyswoole3.0源码,服务启动为例(一)
swoole已经升级到4了,主要的特性是更好的支持协程,easyswoole也为了更好支持协程推出了es3.我本地环境是php7.2.9 centos7 在github下载最新的3.0的demo.地址 ...
- 分析easyswoole3.0源码,Trace组件(四)
前文,我们访问地址的时候服务端会输出类似trace信息.那么原理是什么呢?其实es3已经把这个独立出来作为单独组件了,名字叫做Trace组件 在demo里的调用原理是 EasySwooleEvent: ...
- 分析easyswoole3.0源码,体验es3(三)
demo在手,总得去试试看效果吧.我们先把默认的服务改成webserver,并且添加数据库的配置. 建立数据库,github里面有相关内容 CREATE TABLE `user_list` ( `us ...
- Swoole 实战:MySQL 查询器的实现(协程连接池版)
目录 需求分析 使用示例 模块设计 UML 类图 入口 事务 连接池 连接 查询器的组装 总结 需求分析 本篇我们将通过 Swoole 实现一个自带连接池的 MySQL 查询器: 支持通过链式调用构造 ...
- Druid源码阅读之连接池
概述 Druid是阿里巴巴开源的一个数据库连接池 源码地址.下面简单分析一下连接池是怎么实现的 怎么开始阅读 如果使用过Druid连接池的都只要在Spring配置中配置jdbc的时候配置Driver是 ...
- Solr4.8.0源码分析(24)之SolrCloud的Recovery策略(五)
Solr4.8.0源码分析(24)之SolrCloud的Recovery策略(五) 题记:关于SolrCloud的Recovery策略已经写了四篇了,这篇应该是系统介绍Recovery策略的最后一篇了 ...
- Solr4.8.0源码分析(14)之SolrCloud索引深入(1)
Solr4.8.0源码分析(14) 之 SolrCloud索引深入(1) 上一章节<Solr In Action 笔记(4) 之 SolrCloud分布式索引基础>简要学习了SolrClo ...
随机推荐
- gentoo hibernate
首先修改内核: Power management and ACPI options ---> [*] Suspend to RAM and standby [*] Hibernation (ak ...
- spring boot 监听器实例
在日常项目中订单创建成功后,会有类似各式各样的通知.有站内通知.短信通知.微信,app通知. 伪代码: 这里,只用伪代码示例.各式各样的通知 肯定不只一行代码.只是简化.如果后续还要增加各种各样的通知 ...
- pgsql 常用命令
1.连接到pgsql数据库 psql -U postgres 2.查看所有数据库 \l 3.连接到数据库test \c test 4.查看数据库所有表以及视图 \d 5.查看数据库所有的表 \dt 6 ...
- ssh 使用技巧
参考:https://deepzz.com/post/how-to-setup-ssh-config.html SSH Config 那些你所知道和不知道的事 预览目录 配置项说明 相关技巧 管理多组 ...
- drf框架之 路飞学城(第二天)
1.第二天的项目是用户购物的数据存入到购物车中,这样保存的数据是存放在redis中 1. 首先先配置redis的数据库链接: #注意, 数据从redis中获取到的内容,最原始的是二进制形式的数据,想要 ...
- WPF 主窗口关闭时结束所有相关线程
程序主窗口的 Closed 事件中添加代码: Process.GetCurrentProcess().Kill();
- 【活动发布】捷微H5-微信新年砍价活动,开源发布了
活动名称: 微信新年砍价 适用项目: 捷微H5活动平台源码下载:http://yun.jeecg.org/pmall/detail/924D63E4F73B4387B75DE9B8545136C5 视 ...
- JEECG 上传插件升级-标签
前言: 现有的uploadify上传是基于swf的,随着H5的普及,flash即将退出历史舞台,JEECG团队本着与时俱进的原则,将全面升级JEECG系统中的上传功能,采用新式上传插件plupload ...
- Nexus构建
参考文章: Maven远程仓库搭建与配置(https://my.oschina.net/u/1455528/blog/637063) Maven仓库—Nexus环境搭建及简单介绍(http://blo ...
- Redis内存分析工具redis-rdb-tools
一.安装redis-rdb-tools(项目地址:github) # git clone https://github.com/sripathikrishnan/redis-rdb-tools# cd ...