关于使用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
MysqliObject.php
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
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小时断线,你就第二天) 再去调用接口,就不会有获取数据库连接超时的异常报错了