webman2.1怎么实现请求结束后,数据库连接就关闭,并且在连接池里移除当前数据库链接

彭彭

问题描述

webman2.1支持了协程和数据库连接池,不管是laravel-orm还是thinkphp-orm,都在webman/database和webman/think-orm里集成了连接池,支持在协程和非协程环境下使用,我的问题是怎么实现请求结束后,数据库连接就关闭,并且在连接池里移除当前数据库链接。因为我的场景是根据请求头不同,数据库也不一样,有很多个数据库需要连接。

请教各位社区大佬,有什么比较好的解决方案,谢谢!!!

291 6 1
6个回答

nitron

老实说,转回FPM吧,别挣扎了,非贬义

  • 暂无评论
qqxxr

saas目前好像就fpm比较适合点

  • 暂无评论
JustForFun

既然不需要连接池,那你不要用就是

  • 暂无评论
efnic

最简单的方法,就是 克隆一份 webman/databasewebman/think-orm;根据自己的需要重写部分逻辑。
再弄个全局中间件,实现你的切换需求。

  • 暂无评论
walkor 打赏

截图
这个设置为1就1秒后自动关闭了

  • walkor 13天前

    1秒内这个连接被使用的话会进入非空闲状态,用完后会进入空闲时间,空闲时间大于1时断开。

  • 小W 13天前

    那这个业务还有必要开启协程池吗

  • efnic 13天前

    开启协程可提高并发处理能力,和动态切换数据库,不冲突。

  • walkor 13天前

    pool支持非协程环境,这个参数非协程环境也会生效。

  • qqxxr 13天前

    设置1秒,虽然不常驻了,但是还是比fpm快

  • 彭彭 13天前

    感谢walkor!

  • 彭彭 13天前

    看源码不管是DatabaseManager还是DbManager类里,都有一个Context::onDestroy()方法,如果想请求之后马上彻底关闭,是不是在这时改造,直接调pool的closeConnections()即可?另外,请教Context::onDestroy()里注册的闭包,是什么执行的,协程请求结束php回收机制自动回收吗,还是下一次请求里Context::reset()的时候?

  • walkor 13天前

    直接设置idle_timeout就行了,closeConnections是关闭idle的连接,当前正在用的连接还没归还不会关闭。

ichynul

配置里面定义不同的连接,根据需要切换。
连接池是根据选择的连接创建:
$key = "think-orm.connections.$name";

  • ichynul 13天前

    或者直接在代码里面配置,类似以下代码(没测试):

    $config = [
        'default' => 'mysql_123',
        'connections' => [
            'mysql_123' => [
                // 数据库类型
                'type' => 'mysql',
                // 服务器地址
                'hostname' => '127.0.0.1',
                // 数据库名
                'database' => 'webman',
                // 数据库用户名
                'username' => 'webman',
                // 数据库密码
                'password' => '123456',
                // 数据库连接端口
                'hostport' => '3306',
                // 数据库连接参数
                'params' => [
                    // 连接超时3秒
                    \PDO::ATTR_TIMEOUT => 3,
                ],
                // 数据库编码默认采用utf8
                'charset' => 'utf8',
                // 数据库表前缀
                'prefix' => 'wa_',
                // 断线重连
                'break_reconnect' => true,
                // 连接池配置
                'pool' => [
                    'max_connections' => 5, // 最大连接数
                    'min_connections' => 1, // 最小连接数
                    'wait_timeout' => 3,    // 从连接池获取连接等待超时时间
                    'idle_timeout' => 60,   // 连接最大空闲时间,超过该时间会被回收
                    'heartbeat_interval' => 50, // 心跳检测间隔,需要小于60秒
                ],
            ],
        ],
        // 自定义分页类
        'paginator' =>  '',
    ]
    support\think\Db:setConfig($config);
    support\think\Db::connect('mysql_123');
    support\think\Db::name('tes')->select();
  • 彭彭 13天前

    谢谢!

🔝