关于使用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

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

你可能感兴趣的:(数据库,mysql,oracle)