hyperf 多数据库(要分库的来看)实时连接第二方案(无需预先定义config连接池,无需重启项目)

news/2024/6/18 19:01:54 标签: 数据库, oracle, android

第一方案连接:

https://blog.csdn.net/mark885/article/details/137040284

思路:通过 Hyperf\Contract\ConfigInterface 配置接口类修改内存中的配置信息,在框架启动完成后的事件中定义监听(效果是框架启动后自动设置一次数据库连接池配置)。

1.App\System\Service\SystemConfig\ConfigDatabaseService.php 内容:

<?php

declare(strict_types=1);

namespace App\System\Service\SystemConfig;

use Mine\Abstracts\AbstractService;
use Hyperf\Di\Annotation\Inject;
use Hyperf\Contract\ConfigInterface;
class ConfigDatabaseService extends AbstractService
{
    #[Inject]
    protected ConfigInterface $config;

    //获取进程中 数据库连接池 数组
    public function getDatabasePool(): array
    {
        return $this->config->get('databases', []);
    }

    //重新设置进程中 数据库连接池 数组
    public function setDatabasePool(): void
    {
        $dbDefault = $this->getDatabasePool();
        //$dbList 数据库id,最终组成的数据库是:newdb_1, newdb_2
        $dbList = [['id' => 1], ['id' => 2], ['id' => 3]];
        
        $dbArr = [];
        foreach ($dbList as $key => &$val){
            $val = (array)$val;
            if(isset($dbDefault['newdb_' . $val['id']])){
                continue;
            }
            $tmp = $dbDefault['default'];
            //数据库
            $tmp['database'] = 'newdb_' . $val['id'];
            //还可以修改host 密码等,自己打印 $dbDefault 出来看
            //缓存名
            $tmp['cache']['cache_key'] = 'DbCache:'.$val['id'].':%s:m:%s:%s:%s';
            $dbArr['newdb_' . $val['id']] = $tmp;
            unset($tmp);
        }
        if(count($dbArr)){
            $this->config->set('databases', array_merge($dbDefault, $dbArr));
        }
    }
}

2. App\System\Listener\ConfigDbListener.php 内容:

<?php

declare(strict_types=1);

namespace App\System\Listener;

use Hyperf\Event\Annotation\Listener;
use Hyperf\Event\Contract\ListenerInterface;
use Hyperf\Framework\Event\AfterWorkerStart;
use App\System\Service\SystemConfig\ConfigDatabaseService;
use Psr\Container\ContainerExceptionInterface;
use Psr\Container\NotFoundExceptionInterface;

/**
 * Class ConfigDbListener.
 */
#[Listener]
class ConfigDbListener implements ListenerInterface
{
    public function listen(): array
    {
        return [
            AfterWorkerStart::class,
        ];
    }

    /**
     * @throws ContainerExceptionInterface
     * @throws NotFoundExceptionInterface
     */
    public function process(object $event): void
    {
        try {
            //框架启动后,重新设置数据库连接池
            $configDatabaseService = container()->get(ConfigDatabaseService::class);
            $configDatabaseService->setDatabasePool();
            unset($configDatabaseService);
        } catch (\Exception $e) {

        }
    }

}

3.手动设置:

$configDatabaseService = container()->get(ConfigDatabaseService::class);
$configDatabaseService->setDatabasePool();

4.在任意控制器中获取数据库配置是否成功:

$configDatabaseService = container()->get(ConfigDatabaseService::class);
$res = $configDatabaseService->getDatabasePool();
var_dump($res);

以上就是在hyperf中动态设置数据库连接池,觉得对您有帮助的话呢,赞赞赞一下。

场景示例:

前端用户注册成功立即为用户创建一个新数据库,用户5秒内登录,不重启hyperf框架,实现登录后即可连接刚刚创建的新数据库

//注册验证代码省略一万行
\Hyperf\Coroutine\go(function () use ($clinicId){
    //1.为用户创建一个数据库
    //2.重新设置数据库连接池
    $configDatabaseService = container()->get(ConfigDatabaseService::class);
	$res = $configDatabaseService->getDatabasePool();
    unset($configDatabaseService);
});
//响应前端、注册成功了,可以立即登录

http://www.niftyadmin.cn/n/5469738.html

相关文章

基于java实现的弹幕视频网站

开发语言&#xff1a;Java 框架&#xff1a;ssm 技术&#xff1a;JSP JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclip…

通讯录项目实现

引言&#xff1a;通过顺序表的逻辑实现通讯录。这里就不讲关于顺序表的函数了。如果有不明白的可以看我写的顺序表的博客。 目录 顺序表与通讯录的比较 各源文件文件大榄 Contact.c中通讯录相关函数的定义 初始化和销毁通讯录 添加联系人&#xff1a; 删除联系人&#xf…

C语言TCP服务器模型 : select + 多线程与双循环单线程阻塞服务器的比较

观察到的实验现象: 启动三个客户端: 使用双循环阻塞服务器:只能accept后等待收发,同时只能与一个客户端建立连接,必须等已连接的客户端多次收发 明确断开后才能与下个客户端连接 使用IO多路复用select:可以同时接收所有的连接请求,并且连接状态一直是存活的,直到客户端关闭连…

【Linux】error: Failed to initialize NSS library

【Linux】error: Failed to initialize NSS library 原因&#xff1a;卸载了sqlite [rootnode1 ~]# rpm -qa|grep sql sqlite-3.7.17-8.el7.x86_64 rpm -e --nodeps sqlite-3.7.17-8.el7.x86_64 百度搜索 sqlite-3.7.17-8.el7.x86_64 下载此rpm包 cd /usr/local/download …

FLink学习(三)-DataStream

一、DataStream 1&#xff0c;支持序列化的类型有 基本类型&#xff0c;即 String、Long、Integer、Boolean、Array复合类型&#xff1a;Tuples、POJOs 和 Scala case classes Tuples Flink 自带有 Tuple0 到 Tuple25 类型 Tuple2<String, Integer> person Tuple2.…

为什么企业需要ERP帮助中心?看完你就懂了

企业资源计划&#xff08;ERP&#xff09;系统&#xff0c;这个听起来十分高大上的名词&#xff0c;实际上是许多现代企业后台运行的大脑。从财务管理、人力资源到生产操作和供应链管理&#xff0c;ERP系统如同一个企业的神经中枢&#xff0c;协调着各个部门之间的信息流。但是…

多IP数字证书450元一年送一月

IP数字证书是一种特殊的数字证书。因为互联网的发展和普及&#xff0c;现在大多数网站都是进行了域名解析的域名网站&#xff0c;使用的也是由正规证书颁发机构(CA)颁发的域名数字证书。而IP数字证书则是由证书颁发机构(CA)为只有公网IP地址的网站颁发的数字证书。今天就随SSL盾…

Macbook文件清理软件 Mac电脑清理垃圾文件怎么清理

为了维护Macbook电脑的系统健康&#xff0c;我们需要定期给电脑进行全面清理&#xff0c;清除系统垃圾文件、软件缓存和系统内存。那么好用的Macbook文件清理软件有哪些呢&#xff1f;今天就给大家介绍几款好用的电脑清理软件并介绍Mac电脑清理垃圾文件怎么清理。 一、Macbook…