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

本文主要是介绍hyperf 多数据库(要分库的来看)实时连接第二方案(无需预先定义config连接池,无需重启项目),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

第一方案连接:

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

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

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

<?phpdeclare(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 内容:

<?phpdeclare(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);
});
//响应前端、注册成功了,可以立即登录

这篇关于hyperf 多数据库(要分库的来看)实时连接第二方案(无需预先定义config连接池,无需重启项目)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/875149

相关文章

uniapp接入微信小程序原生代码配置方案(优化版)

uniapp项目需要把微信小程序原生语法的功能代码嵌套过来,无需把原生代码转换为uniapp,可以配置拷贝的方式集成过来 1、拷贝代码包到src目录 2、vue.config.js中配置原生代码包直接拷贝到编译目录中 3、pages.json中配置分包目录,原生入口组件的路径 4、manifest.json中配置分包,使用原生组件 5、需要把原生代码包里的页面修改成组件的方

UE3 的Config文件夹

工作中需要用到UE3,看官方文档中文版翻译有些偷懒和翻译不妥当,故看着英文自己翻译理解了一下,以供后续参考。 目录 基础内容 0.概述  1.uc脚本中的类定义关联配置文件和保存 2.保存配置文件API SaveConfig() StaticSaveConfig() 3.ucc 编译的时候使用 4.配置文件类型 Default 配置文件 和 XXX 配置文件  Base 配置

用Microsoft.Extensions.Hosting 管理WPF项目.

首先引入必要的包: <ItemGroup><PackageReference Include="CommunityToolkit.Mvvm" Version="8.2.2" /><PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.0" /><PackageReference Include="Serilog

【Altium】查找PCB上未连接的网络

【更多软件使用问题请点击亿道电子官方网站】 1、文档目标: PCB设计后期检查中找出没有连接的网络 应用场景:PCB设计后期,需要检查是否所有网络都已连接布线。虽然未连接的网络会有飞线显示,但是由于布线后期整板布线密度较高,虚连,断连的网络用肉眼难以轻易发现。用DRC检查也可以找出未连接的网络,如果PCB中DRC问题较多,查找起来就不是很方便。使用PCB Filter面板来达成目的相比DRC

eclipse运行springboot项目,找不到主类

解决办法尝试了很多种,下载sts压缩包行不通。最后解决办法如图: help--->Eclipse Marketplace--->Popular--->找到Spring Tools 3---->Installed。

Java面试题:通过实例说明内连接、左外连接和右外连接的区别

在 SQL 中,连接(JOIN)用于在多个表之间组合行。最常用的连接类型是内连接(INNER JOIN)、左外连接(LEFT OUTER JOIN)和右外连接(RIGHT OUTER JOIN)。它们的主要区别在于它们如何处理表之间的匹配和不匹配行。下面是每种连接的详细说明和示例。 表示例 假设有两个表:Customers 和 Orders。 Customers CustomerIDCus

关于如何更好管理好数据库的一点思考

本文尝试从数据库设计理论、ER图简介、性能优化、避免过度设计及权限管理方面进行思考阐述。 一、数据库范式 以下通过详细的示例说明数据库范式的概念,将逐步规范化一个例子,逐级说明每个范式的要求和变换过程。 示例:学生课程登记系统 初始表格如下: 学生ID学生姓名课程ID课程名称教师教师办公室1张三101数学王老师101室2李四102英语李老师102室3王五101数学王老师101室4赵六103物理陈

数据库期末复习知识点

A卷 1. 选择题(30') 2. 判断范式(10') 判断到第三范式 3. 程序填空(20') 4. 分析填空(15') 5. 写SQL(25') 5'一题 恶性 B卷 1. 单选(30') 2. 填空 (20') 3. 程序填空(20') 4. 写SQL(30') 知识点 第一章 数据库管理系统(DBMS)  主要功能 数据定义功能 (DDL, 数据定义语

给数据库的表添加字段

周五有一个需求是这样的: 原来数据库有一个表B,现在需要添加一个字段C,我把代码中增删改查部分进行了修改, 比如insert中也添入了字段C。 但没有考虑到一个问题,数据库的兼容性。因为之前的版本已经投入使用了,再升级的话,需要进行兼容处理,当时脑子都蒙了,转不过来,后来同事解决了这个问题。 现在想想,思路就是,把数据库的表结构存入文件中,如xxx.sql 实时更新该文件: CREAT

vue项目集成CanvasEditor实现Word在线编辑器

CanvasEditor实现Word在线编辑器 官网文档:https://hufe.club/canvas-editor-docs/guide/schema.html 源码地址:https://github.com/Hufe921/canvas-editor 前提声明: 由于CanvasEditor目前不支持vue、react 等框架开箱即用版,所以需要我们去Git下载源码,拿到其中两个主