实现一个协程版的mysql连接池,该连接池支持自动创建最小连接数,自动检测mysql健康;基于swoole的chanel。

最近事情忙,心态也有点不积极。技术倒是没有落下,只是越来越不想写博客了。想到平时自己上网上找资料的痛苦,于是将自己这篇连接池的文章放出来,给需要的程序员一点帮助。

<?php

/**
* 实现一个协程版的mysql 连接池
* Created by PhpStorm.
* User: roverliang
* Date: 2018/12/10
* Time: 23:27
*/ namespace console\libs; use Swoole\Coroutine\MySQL as coMysql;
use Swoole\Coroutine\Channel; class CoMysqlPool extends coMysql
{
protected $maxNums; //最大连接数
protected $minNums; //最小连接数
protected $mysqlConfig = array(
'host' => '127.0.0.1',
'port' => 3306,
'user' => 'root',
'password' => '',
'database' => 'hifuli',
'timeout' => -1,
); //mysql配置
protected $chan; //channel
protected $currentConnectedNums; //当前连接数
protected $tag; //标识 /**
* 初始化连接池
* CoMysqlPool constructor.
* @param int $maxNums 最大连接数
* @param int $minNums 最小连接数
* @param array $mysqlConfig mysql配置
*/
public function __construct($maxNums = 20, $minNums = 5, $mysqlConfig = [])
{
$this->maxNums = $maxNums;
$this->minNums = $minNums;
if (!empty($mysqlConfig) && is_array($mysqlConfig)) {
$this->mysqlConfig = $mysqlConfig;
}
$this->chan = new Channel($maxNums);
$this->tag = true;
} /**
* 从连接池中获取一个mysql连接对象
* Created by 梁子(roverliang) <mr.roverliang@gmail.com>
* 2018/12/10
*/
public function pop()
{
if (!$this->tag) return false; if ($mysql = $this->getMysqlInstance()) {
echo "创建了一个mysql".PHP_EOL;
return $mysql;
} $mysql = $this->chan->pop();
if (!$this->checkMysqlHealth($mysql)) {
$mysql = $this->getMysqlInstance();
} else {
echo "复用mysql".PHP_EOL;
}
return $mysql;
} /**
* 将mysql对象放回连接池
* Created by 梁子(roverliang) <mr.roverliang@gmail.com>
* 2018/12/10
* @param $obj
*/
public function push($mysql)
{
if (!$this->tag) return false;
if (!$this->chan->isFull()) {
echo "将mysql放入连接池".PHP_EOL;
$this->chan->push($mysql);
}
return true;
} /**
* 获取mysql实例
* Created by 梁子(roverliang) <mr.roverliang@gmail.com>
* 2018/12/10
* @return bool
*/
protected function getMysqlInstance()
{
if (!$this->chan->isFull()) {
$mysqlInstance = new \Swoole\Coroutine\MySQL();
$mysqlInstance->connect($this->mysqlConfig);
return $mysqlInstance;
}
return false;
} /**
* 检测mysql连接是否健康
* Created by 梁子(roverliang) <mr.roverliang@gmail.com>
* 2018/12/10
*/
protected function checkMysqlHealth($mysql)
{
if (!$mysql->connected) return false;
return true;
} /**
* 销毁连接池
* Created by 梁子(roverliang) <mr.roverliang@gmail.com>
* 2018/12/11
*/
public function destroyPool()
{
$this->tag = false;
while ($this->chan->length()) {
$mysql = $this->chan->pop();
$mysql->close();
echo "销毁mysql".PHP_EOL;
}
return true;
} /**
* 监控进程池
* Created by Roverliang.
* Date: 2018/12/12 Time: 17:12
*/
public function monitorPool()
{
declare(ticks=10);
$self = $this;
register_tick_function(function () use ($self) {
if (($self->chan->length() < $self->minNums) && $self->tag) {
$mysql = $self->pop();
if ($self->checkMysqlHealth($mysql)) {
echo "mysql进程监控池自动创建mysql".PHP_EOL;
$self->push($mysql);
}
}
});
} } go(function(){
$mysqlPool = new CoMysqlPool(10, 2);
$mysqlPool->monitorPool(); for($i=0; $i<20;$i++) {
$mysqlPool->monitorPool();
$mysql = $mysqlPool->pop();
$mysqlPool->push($mysql);
\Swoole\Coroutine::sleep(1);
} $mysqlPool->destroyPool();
});

实现一个协程版mysql连接池的更多相关文章

  1. nodejs + redis/mysql 连接池问题

    nodejs + redis/mysql 连接池问题 需不需要连接池 连接池的作用主要是较少每次临时建立连接所带来的开销.初步一看,nodejs运行单线程上,它不能同时使用多个连接,乍一看是不需要连接 ...

  2. Swoole MySQL 连接池的实现

    目录 概述 代码 扩展 小结 概述 这是关于 Swoole 入门学习的第八篇文章:Swoole MySQL 连接池的实现. 第七篇:Swoole RPC 的实现 第六篇:Swoole 整合成一个小框架 ...

  3. 如何在 Swoole 中优雅的实现 MySQL 连接池

    如何在 Swoole 中优雅的实现 MySQL 连接池 一.为什么需要连接池 ? 数据库连接池指的是程序和数据库之间保持一定数量的连接不断开, 并且各个请求的连接可以相互复用, 减少重复连接数据库带来 ...

  4. 解决Mysql连接池被关闭 ,hibernate尝试连接不能连接的问题。 (默认mysql连接池可以访问的时间为8小时,如果超过8小时没有连接,mysql会自动关闭连接池。系统发布第二天访问链接关闭问题。

    解决Mysql连接池被关闭  ,hibernate尝试连接不能连接的问题. (默认MySQL连接池可以访问的时间为8小时,如果超过8小时没有连接,mysql会自动关闭连接池. 所以系统发布第二天访问会 ...

  5. Java Mysql连接池配置和案例分析--超时异常和处理

    前言: 最近在开发服务的时候, 发现服务只要一段时间不用, 下次首次访问总是失败. 该问题影响虽不大, 但终究影响用户体验. 观察日志后发现, mysql连接因长时间空闲而被关闭, 使用时没有死链检测 ...

  6. MySQL连接池

    1. using System; using System.Collections; using MySql.Data.MySqlClient; namespace Helper { /// < ...

  7. tomcat中使用mysql连接池的配置

    1.下载相应的jar包,添加到工程中 需要下载的包主要有commons-pool2-2.2 commons-dbcp2-2.0.1-src commons-dbcp2-2.0.1  commons-c ...

  8. mysql连接池的使用工具类代码示例

    mysql连接池代码工具示例(scala): import java.sql.{Connection,PreparedStatement,ResultSet} import org.apache.co ...

  9. 用swoole简单实现MySQL连接池

    MySQL连接池 在传统的网站开发中,比如LNMP模式,由Nginx的master进程接收请求然后分给多个worker进程,每个worker进程再链接php-fpm的master进程,php-fpm再 ...

随机推荐

  1. vue源码之抽象dom树

    一.抽象DOM树 使用过vue的朋友应该都知道,vue使用的是虚拟DOM,将DOM抽象成一个以JavaScript对象为节点的虚拟DOM树,以VNode节点模拟真实DOM,可以对这颗抽象树进行创建节点 ...

  2. 解决:git使用git push 命令跳出remote: Permission to A denied to B的问题

    开始git上传项目,不料,在git push这一步骤发生了错误? remote: Permission to qwe2193066947/firstRepository.git denied to m ...

  3. 网络之NSURLSession

    NSUrlSession参考的这篇博客,自己也调试了它的代码:http://www.it165.net/pro/html/201406/15223.html ,对NSUrlSession还不太理解,先 ...

  4. Mybatis 的配置xml和properties放在jar包以外的一种方法

    1.问题 开发时候,将xml和properties放resources,直接可以访问到,然而打包后这两个文件也一同被打包到jar包里面,如果发布后想修改就会比较麻烦,所以希望将xml配置文件和prop ...

  5. SQL Server T—SQL 语句【建 增 删 改】(建外键)

    一 创建数据库         如果多条语句要一起执行,那么在每条语句之后需要加 go 关键字 建库  :  create  database  数据库名  create  database  Dat ...

  6. 当堆遇到STL 代码焕发光芒

    来自度娘的释义,堆的含义大概是这样的: 感性理解: 堆(英语:heap)是计算机科学中一类特殊的数据结构的统称.堆通常是一个可以被看做一棵树的数组对象.堆总是满足下列性质: 堆中某个节点的值总是不大于 ...

  7. Servlet基础知识点整理

    常用注解 官方文档:https://docs.oracle.com/javaee/7/api/toc.htm WebServlet @WebServlet用于定义一个Servlet,等价于下面的xml ...

  8. Idea无法运行Maven项目

    导入项目到tomcat的时候要选择Arifact 如果maven项目没有这个选项, <groupId>com.bihang</groupId> <artifactId&g ...

  9. django rest_framework Serializers 序列化组件

    为什么要用序列化组件 当我们做前后端分离的项目~~我们前后端交互一般都选择JSON数据格式,JSON是一个轻量级的数据交互格式. 那么我们给前端数据的时候都要转成json格式,那就需要对我们从数据库拿 ...

  10. gulp前端自动化环境搭建详解

    1.安装 nodejs Grunt和所有grunt插件都是基于nodejs来运行的, https://nodejs.org/ 安装完成之后在终端 node -v 查看安装版本  npm -v 查看np ...