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

相关文章

Spring配置扩展之JavaConfig的使用小结

《Spring配置扩展之JavaConfig的使用小结》JavaConfig是Spring框架中基于纯Java代码的配置方式,用于替代传统的XML配置,通过注解(如@Bean)定义Spring容器的组... 目录JavaConfig 的概念什么是JavaConfig?为什么使用 JavaConfig?Jav

JAVA项目swing转javafx语法规则以及示例代码

《JAVA项目swing转javafx语法规则以及示例代码》:本文主要介绍JAVA项目swing转javafx语法规则以及示例代码的相关资料,文中详细讲解了主类继承、窗口创建、布局管理、控件替换、... 目录最常用的“一行换一行”速查表(直接全局替换)实际转换示例(JFramejs → JavaFX)迁移建

JavaWeb项目创建、部署、连接数据库保姆级教程(tomcat)

《JavaWeb项目创建、部署、连接数据库保姆级教程(tomcat)》:本文主要介绍如何在IntelliJIDEA2020.1中创建和部署一个JavaWeb项目,包括创建项目、配置Tomcat服务... 目录简介:一、创建项目二、tomcat部署1、将tomcat解压在一个自己找得到路径2、在idea中添加

解决idea启动项目报错java: OutOfMemoryError: insufficient memory

《解决idea启动项目报错java:OutOfMemoryError:insufficientmemory》:本文主要介绍解决idea启动项目报错java:OutOfMemoryError... 目录原因:解决:总结 原因:在Java中遇到OutOfMemoryError: insufficient me

python项目环境切换的几种实现方式

《python项目环境切换的几种实现方式》本文主要介绍了python项目环境切换的几种实现方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 如何在不同python项目中,安装不同的依赖2. 如何切换到不同项目的工作空间3.创建项目

SpringBoot项目整合Netty启动失败的常见错误总结

《SpringBoot项目整合Netty启动失败的常见错误总结》本文总结了SpringBoot集成Netty时常见的8类问题及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录一、端口冲突问题1. Tomcat与Netty端口冲突二、主线程被阻塞问题1. Netty启动阻

python项目打包成docker容器镜像的两种方法实现

《python项目打包成docker容器镜像的两种方法实现》本文介绍两种将Python项目打包为Docker镜像的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 目录简单版:(一次成功,后续下载对应的软件依赖)第一步:肯定是构建dockerfile,如下:第二步

Python + Streamlit项目部署方案超详细教程(非Docker版)

《Python+Streamlit项目部署方案超详细教程(非Docker版)》Streamlit是一款强大的Python框架,专为机器学习及数据可视化打造,:本文主要介绍Python+St... 目录一、针对 Alibaba Cloud linux/Centos 系统的完整部署方案1. 服务器基础配置(阿里

SpringBoot+Vue3整合SSE实现实时消息推送功能

《SpringBoot+Vue3整合SSE实现实时消息推送功能》在日常开发中,我们经常需要实现实时消息推送的功能,这篇文章将基于SpringBoot和Vue3来简单实现一个入门级的例子,下面小编就和大... 目录前言先大概介绍下SSE后端实现(SpringBoot)前端实现(vue3)1. 数据类型定义2.

MySQL MHA集群详解(数据库高可用)

《MySQLMHA集群详解(数据库高可用)》MHA(MasterHighAvailability)是开源MySQL高可用管理工具,用于自动故障检测与转移,支持异步或半同步复制的MySQL主从架构,本... 目录mysql 高可用方案:MHA 详解与实战1. MHA 简介2. MHA 的组件组成(1)MHA