连接池的含义,很多都知道,比如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源码,协程连接池(五)的更多相关文章

  1. 分析easyswoole3.0源码,服务启动为例(二)

    以下内容需要结合es的源码,不然可能会觉得跳跃.先描述下es启动的大致流程.es启动的时候注册异常处理函数以及加载配置文件.根据位置文件的设置选择启动哪种swoole服务.然后用一个事件注册类,注册s ...

  2. 分析easyswoole3.0源码,consoleTcpService(六)

    前文讲过可以通过配置开启一个tcp服务,叫做consoleTcpservice.EasySwoole\EasySwoole\Core::83行 (new TcpService(Config::getI ...

  3. 分析easyswoole3.0源码,服务启动为例(一)

    swoole已经升级到4了,主要的特性是更好的支持协程,easyswoole也为了更好支持协程推出了es3.我本地环境是php7.2.9 centos7 在github下载最新的3.0的demo.地址 ...

  4. 分析easyswoole3.0源码,Trace组件(四)

    前文,我们访问地址的时候服务端会输出类似trace信息.那么原理是什么呢?其实es3已经把这个独立出来作为单独组件了,名字叫做Trace组件 在demo里的调用原理是 EasySwooleEvent: ...

  5. 分析easyswoole3.0源码,体验es3(三)

    demo在手,总得去试试看效果吧.我们先把默认的服务改成webserver,并且添加数据库的配置. 建立数据库,github里面有相关内容 CREATE TABLE `user_list` ( `us ...

  6. Swoole 实战:MySQL 查询器的实现(协程连接池版)

    目录 需求分析 使用示例 模块设计 UML 类图 入口 事务 连接池 连接 查询器的组装 总结 需求分析 本篇我们将通过 Swoole 实现一个自带连接池的 MySQL 查询器: 支持通过链式调用构造 ...

  7. Druid源码阅读之连接池

    概述 Druid是阿里巴巴开源的一个数据库连接池 源码地址.下面简单分析一下连接池是怎么实现的 怎么开始阅读 如果使用过Druid连接池的都只要在Spring配置中配置jdbc的时候配置Driver是 ...

  8. Solr4.8.0源码分析(24)之SolrCloud的Recovery策略(五)

    Solr4.8.0源码分析(24)之SolrCloud的Recovery策略(五) 题记:关于SolrCloud的Recovery策略已经写了四篇了,这篇应该是系统介绍Recovery策略的最后一篇了 ...

  9. Solr4.8.0源码分析(14)之SolrCloud索引深入(1)

    Solr4.8.0源码分析(14) 之 SolrCloud索引深入(1) 上一章节<Solr In Action 笔记(4) 之 SolrCloud分布式索引基础>简要学习了SolrClo ...

随机推荐

  1. java工具类——java将一串数据按照gzip方式压缩和解压缩

    我要整理在工作中用到的工具类分享出来,也方便自己以后查阅使用,这些工具类都是我自己实际工作中使用的 import java.io.ByteArrayInputStream; import java.i ...

  2. 封装poi导出篇

    前言 先写的导入,以为导出会很简单,没想到导出的东西也不少,基于常用的几种样式和校验写了一个简单的导出,包括时间,数字,文字长度,下拉框,提示框校验,基础样式包括字体,字体颜色,背景颜色等功能,可以使 ...

  3. ubuntu python的升级与回滚

    转自:https://www.cnblogs.com/wmr95/p/7637077.html 正常情况下,你安装好ubuntu16.04版本之后,系统会自带 python2.7版本,如果需要下载新版 ...

  4. 树莓派3使用openSUSE Ports 42.3 驱动GPIO注意事项

    安装好opensuse 42.3以后,安装wiringPi库. 由于/proc/cpuinfo文件缺少“Hardware”信息,导致出现如下错误: Oops: Unable to determine ...

  5. 容器部署解决方案Docker

      容器部署解决方案Docker 课程目标 目标1:了解Docker与虚拟机的不同点,相比的优势 目标2:掌握Docker的启动方法 目标3:掌握Docker镜像操作 目标4:掌握Docker容器操作 ...

  6. JAVA 解决 SpringBoot 本地读取文件成功,打包后读取文件失败的方法

    SpringBoot 的日常开发中,我们会发现当我们使用  InputStream input = getClass.getResource(path) 读取文件或者模板时,在 ida 中运行 测试的 ...

  7. Java学习前的一些准备

    1.JDK - (Java SE Development Kit) JDK是Java开发所需要的环境,就跟我们想玩某个网游一样,玩之前一定是需要先安装相应的程序包的.那这个JDK就是我们准备登陆Jav ...

  8. mac 环境搭建

    安装homebrew jdk 也可以官网下载 maven 官网下载tar.gz包 也在homebrew下安装git,java,mysql.

  9. week05 codelab01 Babel ES6 webpack Nodejsserver等

    Babel 他出现的原因就是很多浏览器还未完全兼容ES6 需要将你写的ES6的内容转换成ES5让浏览器兼容运行 ES5和ES6相比出现很多新内容 比如拼接字符串 ES6可以` ` 里面如果引用变量就用 ...

  10. 聊聊 HashMap

    数据存储底层? 数据底层具体存储是一个Node<K,V> HashMap 是基于哈希来映射的,那当映射冲突时候怎么解决? 链地址,数组+链表 HashMap 什么时候扩容? 负载因子 lo ...