关于使用Easyswoole 自定义MYSQL 连接池,一段时间后,操作接口,报数据库连接错误,然后在请求接口,就正常了

关于使用Easyswoole 自定义MYSQL 连接池,一段时间后,操作接口,报数据库连接错误,然后在请求接口,就正常了 

首先我们来看看对应的easyswoole 数据库注册

Config/Mysq.php

$mysql['mysql'] = [];
$mysql['mysql']['default'] = ['name' => 'default','host' => '127.0.0.1','port' => 3306,'user' => 'test','password' => '122355666','database' => 'test','timeout' => '5','charsset' => 'utf8',// 以下是连接池属性"intervalCheckTime" => 5,// 定时器执行频率 用于定时执行连接池对象回收,创建操作"maxIdleTime" => 5, // 连接池对象最大闲置时间(秒)"minObjectNum" => 5, // 连接池最小连接数"maxObjectNum" => 30, // 连接池最大连接数"getObjectTimeout" => 8.0, //"autoPing" => 8,// 间隔自动 ping的时间
];
return $mysql;

我们在对应的地方进行连接池与数据对象的编写

App/Pool

MysqliPool.php

<?phpnamespace App\Pool;use EasySwoole\Pool\AbstractPool;
use EasySwoole\Pool\Config;
use EasySwoole\Pool\Exception\Exception;class MysqliPool extends AbstractPool
{public function __construct(Config $conf){try {parent::__construct($conf);} catch (Exception $e) {}}// 创建对象protected function createObject(){// TODO: Implement createObject() method.return new MysqliObject();}
}

MysqliObject.php
 

<?phpnamespace App\Pool;use EasySwoole\EasySwoole\Config;
use EasySwoole\Mysqli\Client;
use EasySwoole\Pool\ObjectInterface;
use EasySwoole\Pool\Manager;class MysqliObject extends Client implements ObjectInterface {const TYPE = "default";public function __construct() {$mysqlConfig = Config::getInstance()->getConf("mysql.default");parent::__construct(new \EasySwoole\Mysqli\Config($mysqlConfig));}// 被连接池 unset 的时候执行public function gc() {// TODO: Implement gc() method.$this->close();}// 被连接池 回收的时候执行public function objectRestore() {// TODO: Implement objectRestore() method.}// 取出连接池的时候被调用,若返回false,则当前对象被弃用回收public function beforeUse(): ?bool {// TODO: Implement beforeUse() method.return true;}/*** 个人创建的方法 用于 获取连接池的连接*/public static function borrowPool(): ?MysqliObject {try {return Manager::getInstance()->get(self::TYPE)->getObj(500, 6);} catch (\Throwable $e) {\EasySwoole\EasySwoole\Trigger::getInstance()->error("获取连接失败");}}/*** 个人创建方法 用于 归还连接*/public static function returnPool(?MysqliObject $client) {try {Manager::getInstance()->get(self::TYPE)->recycleObj($client);} catch (\Throwable $e) {//\EasySwoole\EasySwoole\Trigger::getInstance()->error("归还连接失败");}}
}

注册文件 

EasySwooleEvent.php

<?phpnamespace EasySwoole\EasySwoole;use EasySwoole\EasySwoole\AbstractInterface\Event;
use EasySwoole\EasySwoole\Config;
use EasySwoole\EasySwoole\Swoole\EventRegister;
use App\Exception\ExceptionHandler;
use EasySwoole\Component\Di;
use EasySwoole\Http\Request;
use EasySwoole\Http\Response;
use App\WebSocket\WebSocketEvents;
use App\WebSocket\WebSocketParser;class EasySwooleEvent implements Event {public static function initialize() {date_default_timezone_set('Asia/Shanghai');// 加载Config下所有配置self::loadConfig();//注册mysqli连接池self::InitMysql();}public static function loadConfig() {Config::getInstance()->loadDir(EASYSWOOLE_ROOT . '/Config');//print_r(Config::getInstance()->getConf());}public static function InitMysql() {$mysqliPoolConfig = new \EasySwoole\Pool\Config([// 获取连接最大等待时间"maxIdleTime" => 10,// 最小连接数"minObjectNum" => 20,// 最大连接数"maxObjectNum" => 1000,// 获取连接超时时间"getObjectTimeout" => 65,]);try {\EasySwoole\Pool\Manager::getInstance()->register(new \App\Pool\MysqliPool($mysqliPoolConfig),\App\Pool\MysqliObject::TYPE);} catch (Throwable $e) {echo "系统启动时注册mysql异常 Msg:{$e->getMessage()}" . "\n";};}
}

然后我们这里写一个接口  然后去调用  结果发现其会报MYSQL 2006 连接超时的问题   

于是乎找了一个方法 就是在取出连接池的时候  进行一个连接判断,若连接取出前进行一个连接判断  就可以避免上述问题  

此刻我们修改MysqliObject.php 文件

 // 取出连接池的时候被调用,若返回false,则当前对象被弃用回收public function beforeUse(): ?bool {// TODO: Implement beforeUse() method.return $this->ping();}public function ping():?bool {try {$a = $this->rawQuery('SELECT 1');return true;} catch (\Throwable $e){return false;}}

在beforeUse方法中 加入一个数据库的连接测试 若连接正常 返回true,否者返回false 

修改好后,重启easyswoole ,等待一段时间(默认8小时断线,你就第二天) 再去调用接口,就不会有获取数据库连接超时的异常报错了 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/868918.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据安全治理:从库级权限申请到表级权限申请

背景 随着数据安全意识的提高&#xff0c;企业越来越重视数据治理和权限管理。传统数仓大多对库级别进行读写授权&#xff0c;仅对人工标记的敏感库进行表级别授权&#xff0c;但由于敏感等级是由人为标记&#xff0c;错误率较高&#xff0c;故期望将权限申请流程细化到表级申…

树莓派_Pytorch学习笔记20:初步认识深度学习框架

今日继续学习树莓派4B 4G&#xff1a;&#xff08;Raspberry Pi&#xff0c;简称RPi或RasPi&#xff09; 本人所用树莓派4B 装载的系统与版本如下: 版本可用命令 (lsb_release -a) 查询: ​ Python 版本3.7.3&#xff1a; ​ 本文很水&#xff0c;就介绍一下我以后的学习使用P…

【线程同步-1】

三大不安全案例 1、车站买票 package syn; ​ //不安全的买票 //线程不安全&#xff0c;有负数 public class UnsafeBuyTicket {public static void main(String[] args) {BuyTicket buyTicket new BuyTicket();new Thread(buyTicket,"xiaoming").start();new Thr…

STM32-按键及传感器模块

本内容是基于江协科技STM32视频整理而得。 1. 按键及传感器模块 1.1 按键简介 按键&#xff1a;常见的输入设备&#xff0c;按下导通&#xff0c;松手断开&#xff1b; 按键抖动&#xff1a;由于按键内部使用的是机械式弹簧片来进行通断的&#xff0c;所以在按下和松手的瞬间…

【代码随想录】【算法训练营】【第63天】 [卡码53]寻宝

前言 思路及算法思维&#xff0c;指路 代码随想录。 题目来自 LeetCode。 day 63&#xff0c;周二&#xff0c;ding~ 题目详情 [卡码53] 寻宝 题目描述 卡码53 寻宝 解题思路 前提&#xff1a; 思路&#xff1a; 重点&#xff1a; 代码实现 C语言 prim算法 kruskal…

百望股份于港交所上市 用户量突破2300万

7月9日&#xff0c;百望股份&#xff08;股份代码&#xff1a;6657.HK&#xff09;正式于港交所上市&#xff0c;以32港元价格开盘&#xff0c;成为“电子发票第一股”。 招股书披露&#xff0c;百望股份成立于2015年&#xff0c;作为一家专注于企业数字化解决方案的提供商&…

C++ | Leetcode C++题解之第221题最大正方形

题目&#xff1a; 题解&#xff1a; class Solution { public:int maximalSquare(vector<vector<char>>& matrix) {if (matrix.size() 0 || matrix[0].size() 0) {return 0;}int maxSide 0;int rows matrix.size(), columns matrix[0].size();vector<…

java springboot监听事件和处理事件

在Spring Boot中&#xff0c;监听和处理事件是一种常用的模式&#xff0c;用于在应用程序的不同部分之间传递信息。Spring 的事件发布/订阅模型允许我们创建自定义事件&#xff0c;并在这些事件发生时由注册的监听器进行处理。这里&#xff0c;我将提供一个简单的Spring Boot应…

在Mac上一键安装Mysql(解决所有安装问题)

重点强调安装mysql成功的关键在于安装的版本不能是最新&#xff01;&#xff01; 目录 一&#xff1a;下载mysql数据库安装部分到此结束 二&#xff1a;配置mysql数据库三&#xff1a;启动mysql数据库四&#xff1a;各类奇葩问题总结 一&#xff1a;下载mysql数据库 1.进入MyS…

214.贪心算法:K次取反后最大化的数组和(力扣)

class Solution { public:int largestSumAfterKNegations(vector<int>& nums, int k) {int sum 0;// 进行k次取反操作while (k > 0){// 对数组进行排序sort(nums.begin(), nums.end());// 将最小的元素取反nums[0] -nums[0];// 减少k的值k--;}// 计算数组的总和…

代码随想录算法训练营:27/60

非科班学习算法day27 | LeetCode455:分发饼干 &#xff0c;Leetcode376:摆动序列 &#xff0c;Leetcode53:最大子数组和 介绍 包含LC的两道题目&#xff0c;还有相应概念的补充。 相关图解和更多版本&#xff1a; 代码随想录 (programmercarl.com)https://programmercarl.c…

【触想智能】工业一体机在工程机械车辆上的应用分析

随着工程机械行业的不断发展和自动化程度的提高&#xff0c;工业一体机在工程机械车辆上的应用越来越广泛。工业一体机是集电脑、显示器、触摸屏、通讯、测量、控制等多种功能于一体的高度集成化的工业控制系统&#xff0c;在工程机械车辆上的应用可以为用户提供更为便捷、高效…

CVE-2024-36991:Splunk Enterprise任意文件读取漏洞复现 [附POC]

文章目录 CVE-2024-36991:Splunk Enterprise任意文件读取漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现0x06 修复建议CVE-2024-36991:Splunk Enterprise任意文件读取漏洞复现 [附POC] 0x01 前言 免责声明:…

Java并发/多线程CompleteableFuture详解

目录 CompleteableFuture 创建 获得结果的方法 辅助方法 allOf和anyOf的区别 CompletableFuture 里大约有五十种方法&#xff0c;但是可以进行归类: 变换类 thenApply 消费类 thenAccept 执行操作类 thenRun thenApply/thenAccept/thenRun 结合转化类 thenCombine 结…

OpenCV简单图像处理(仿射变换、单应性变换、图像特征提取、特征匹配)----20240709

一、仿射变换 几何变换是指对对图像的位置、大小、形状、投影进行变换,是将图像从原始平面投影到新的视平面。仿射变换(Affine)的特点是原始图像中的平行关系和线段长度比例关系保持不变。 仿射变换矩阵中有 6 个未知参数,cv2.getAffineTransform() 根据图像中不共线的 3 个…

如何成功的设计BGA?

目前&#xff0c;用于容纳各种先进多功能半导体器件&#xff08;如 FPGA 和微处理器&#xff09;的标准封装是球栅阵列 &#xff08;BGA&#xff09;。BGA 封装中的组件用于各种嵌入式设计中&#xff0c;既可用作主机处理器&#xff0c;也可用作存储器等外设。多年来&#xff0…

硅纪元小课堂 | 重燃回忆!手把手教你用AI免费让老照片“活”起来!

在这个数字化的时代&#xff0c;我们的照片承载了无数珍贵的回忆。然而&#xff0c;随着时间的流逝&#xff0c;这些照片可能会褪色、损坏&#xff0c;甚至丢失。但现在&#xff0c;有了AI技术的加持&#xff0c;我们可以让这些老照片重新焕发生机&#xff0c;甚至让它们“活”…

图论·Day01

P3371 P4779 P3371 【模板】单源最短路径&#xff08;弱化版&#xff09; 注意的点&#xff1a; 边有重复&#xff0c;选择最小边&#xff01;对于SPFA算法容易出现重大BUG&#xff0c;没有负权值的边时不要使用&#xff01;&#xff01;&#xff01; 70分代码 朴素板dijsk…

《人生苦短,我用python·八》多线程和线程池的使用

在Python中&#xff0c;多线程是一种并发编程技术&#xff0c;它允许多个线程在程序中并行执行。这对于IO密集型任务&#xff08;如网络请求、文件读写等&#xff09;非常有用&#xff0c;因为这些任务在等待外部资源时可以让其他线程继续工作&#xff0c;从而提高程序的效率。…

openssl交叉编译-移植ARM

OpenSSL是一个开源的密码学工具包&#xff0c;提供了一组用于网络安全的加密和解密算法、协议以及相关工具的库&#xff0c;它通过提供多种加密算法、协议和工具&#xff0c;为网络通信和数据存储提供了强大的安全保障。 主要功能 加密和解密&#xff1a; OpenSSL提供了多种对…