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

相关文章

Python开发文字版随机事件游戏的项目实例

《Python开发文字版随机事件游戏的项目实例》随机事件游戏是一种通过生成不可预测的事件来增强游戏体验的类型,在这篇博文中,我们将使用Python开发一款文字版随机事件游戏,通过这个项目,读者不仅能够... 目录项目概述2.1 游戏概念2.2 游戏特色2.3 目标玩家群体技术选择与环境准备3.1 开发环境3

MySQL数据库约束深入详解

《MySQL数据库约束深入详解》:本文主要介绍MySQL数据库约束,在MySQL数据库中,约束是用来限制进入表中的数据类型的一种技术,通过使用约束,可以确保数据的准确性、完整性和可靠性,需要的朋友... 目录一、数据库约束的概念二、约束类型三、NOT NULL 非空约束四、DEFAULT 默认值约束五、UN

电脑找不到mfc90u.dll文件怎么办? 系统报错mfc90u.dll丢失修复的5种方案

《电脑找不到mfc90u.dll文件怎么办?系统报错mfc90u.dll丢失修复的5种方案》在我们日常使用电脑的过程中,可能会遇到一些软件或系统错误,其中之一就是mfc90u.dll丢失,那么,mf... 在大部分情况下出现我们运行或安装软件,游戏出现提示丢失某些DLL文件或OCX文件的原因可能是原始安装包

电脑显示mfc100u.dll丢失怎么办?系统报错mfc90u.dll丢失5种修复方案

《电脑显示mfc100u.dll丢失怎么办?系统报错mfc90u.dll丢失5种修复方案》最近有不少兄弟反映,电脑突然弹出“mfc100u.dll已加载,但找不到入口点”的错误提示,导致一些程序无法正... 在计算机使用过程中,我们经常会遇到一些错误提示,其中最常见的就是“找不到指定的模块”或“缺少某个DL

MySQL 多表连接操作方法(INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL OUTER JOIN)

《MySQL多表连接操作方法(INNERJOIN、LEFTJOIN、RIGHTJOIN、FULLOUTERJOIN)》多表连接是一种将两个或多个表中的数据组合在一起的SQL操作,通过连接,... 目录一、 什么是多表连接?二、 mysql 支持的连接类型三、 多表连接的语法四、实战示例 数据准备五、连接的性

MySQL中的分组和多表连接详解

《MySQL中的分组和多表连接详解》:本文主要介绍MySQL中的分组和多表连接的相关操作,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录mysql中的分组和多表连接一、MySQL的分组(group javascriptby )二、多表连接(表连接会产生大量的数据垃圾)MySQL中的

SpringBoot项目中报错The field screenShot exceeds its maximum permitted size of 1048576 bytes.的问题及解决

《SpringBoot项目中报错ThefieldscreenShotexceedsitsmaximumpermittedsizeof1048576bytes.的问题及解决》这篇文章... 目录项目场景问题描述原因分析解决方案总结项目场景javascript提示:项目相关背景:项目场景:基于Spring

解决Maven项目idea找不到本地仓库jar包问题以及使用mvn install:install-file

《解决Maven项目idea找不到本地仓库jar包问题以及使用mvninstall:install-file》:本文主要介绍解决Maven项目idea找不到本地仓库jar包问题以及使用mvnin... 目录Maven项目idea找不到本地仓库jar包以及使用mvn install:install-file基

Java Response返回值的最佳处理方案

《JavaResponse返回值的最佳处理方案》在开发Web应用程序时,我们经常需要通过HTTP请求从服务器获取响应数据,这些数据可以是JSON、XML、甚至是文件,本篇文章将详细解析Java中处理... 目录摘要概述核心问题:关键技术点:源码解析示例 1:使用HttpURLConnection获取Resp

C 语言中enum枚举的定义和使用小结

《C语言中enum枚举的定义和使用小结》在C语言里,enum(枚举)是一种用户自定义的数据类型,它能够让你创建一组具名的整数常量,下面我会从定义、使用、特性等方面详细介绍enum,感兴趣的朋友一起看... 目录1、引言2、基本定义3、定义枚举变量4、自定义枚举常量的值5、枚举与switch语句结合使用6、枚