当前位置: 首页 > news >正文

springboot mongodb 配置多数据源

我想要的效果是,一个类统一管理多数据源,我传个参数进去,它就能返回我对应的mongotemplate

但是根据"mongbodb 多数据源"的关键词,找不到我想要的效果

网上大多都是明确知道自己是几个数据源,然后每个数据源具体配置,然后业务代码调用的时候,直接注入不同的数据源,这样的话,不太利于以后的数据库扩容

目录

网上找到的多数据源写法

自用易扩展的多数据源写法


比如如下的这种,我在网上找到的写法。

网上找到的多数据源写法

配的时候是这样的

spring:data:mongodb:primary:uri: mongodb://localhost:27017/primarysecondary:uri: mongodb://localhost:27017/secondary

写配置class

@Configuration
public class PrimaryMongoConfig {@Bean@Primary@ConfigurationProperties(prefix = "spring.data.mongodb.primary")public MongoClient primaryMongoClient() {return MongoClients.create();}@Primary@Bean(name = "primaryMongoTemplate")public MongoTemplate primaryMongoTemplate() {return new MongoTemplate(primaryMongoClient(), "primary");}
}@Configuration
public class SecondaryMongoConfig {@Bean@ConfigurationProperties(prefix = "spring.data.mongodb.secondary")public MongoClient secondaryMongoClient() {return MongoClients.create();}@Bean(name = "secondaryMongoTemplate")public MongoTemplate secondaryMongoTemplate() {return new MongoTemplate(secondaryMongoClient(), "secondary");}
}

这样注入了2个Bean

@Service
public class ProductService {@Autowired@Qualifier("secondaryMongoTemplate")private MongoTemplate mongoTemplate;public void saveProduct(Product product) {mongoTemplate.save(product);}
}

通过标明名称的方式,来注入具体的数据源。

这种有个坏处,就是以后如果想扩展数据库,就必须来个类似于thirdMongoTemplate的玩意,然后需要写个switchCase的东西,返回具体的mongoTemplate

所以,我需要自己写个符合我需求的mongoTemplate的聚集类。

自用易扩展的多数据源写法

我的设计是,多数据源以配置文件里,数组的方式进行传入

如下

spring.data.mongodb.sources[0].url=mongodb://localhost:27017
spring.data.mongodb.sources[0].name=mongodb_0
spring.data.mongodb.sources[0].dbName=myTest
spring.data.mongodb.sources[1].url=mongodb://localhost:27017
spring.data.mongodb.sources[1].name=mongodb_1
spring.data.mongodb.sources[1].dbName=myTest_1

我现在暂时设置了2个数据源,url为真实链接,dbName为数据库名称,name为我之后要获取这玩意,设置的key名称。不用拘泥于这些名字,都是我自定义出来的。

对应这些配置,我定义了一个配置类去接。

@Data
@Component
@ConfigurationProperties(prefix = "spring.data.mongodb")
public class MongoConfig {//sources跟配置文件的键名对应上,如果配置文件不叫这个,也跟着换下private List<MongoSource> sources;
}

因为配的是数组对象,也设置下该对象

@Data
public class MongoSource {private String name;private String url;private String dbName;
}

@Data 是lombada插件的

然后构造一下我想要的,管理多数据源的类

public class MongoFactory {// 这里的修饰符自己定吧,按你自己的需求private Map<String, MongoTemplate> dbMap = new HashMap<>();public MongoFactory() {}public void init(MongoConfig config) {// 初始化多数据源的map吧for (MongoSource item : config.getSources()) {MongoClient client = MongoClients.create(item.getUrl());dbMap.put(item.getName(), new MongoTemplate(client, item.getDbName()));}}public MongoTemplate getTemplate(String dbName) {return dbMap.get(dbName);}
}

这里有个很坑的地方,new MongoTemplate(client, item.getDbName()),这里的第2个参数,是指链接里要填的dataBase名称,别乱填了

将这个类进行注册

@Configuration
public class BeanFactoryConfig {//引入配置@Resource private MongoConfig config;//注册一下我自己造的factory@Beanpublic MongoFactory mongoFactory() {MongoFactory factory = new MongoFactory();factory.init(config);return factory;}
}

进行使用,直接进行注入

@Resource private MongoFactory factory;

比如说,判断该数据源是否存在某集合 

boolean flag =factory.getTemplate(name).collectionExists(collectionName);

factory.getTemplate(name) 根据name,可以从map拿到对应的数据源。

以上,我的需求就实现完毕。

相关文章:

springboot mongodb 配置多数据源

我想要的效果是&#xff0c;一个类统一管理多数据源&#xff0c;我传个参数进去&#xff0c;它就能返回我对应的mongotemplate 但是根据"mongbodb 多数据源"的关键词&#xff0c;找不到我想要的效果。 网上大多都是明确知道自己是几个数据源&#xff0c;然后每个数…...

Python3 安装、环境变量配置、PyCharm新建Python项目

一、安装包下载 Pyhton官网下载>>最新稳定版的安装包&#xff1a; 找到合适的版本进行下载&#xff1a; 如果下载较慢&#xff0c;此处提供一个3.10.11的稳定版本的安装包&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/16GnWjkGFuSfWfaI9UVX8qA?pwd4u5o 提取…...

用python来爬取某鱼的商品信息(2/2)

目录 上一篇文章 本章内容 设置浏览器为运行结束后不关闭&#xff08;可选&#xff09; 定位到搜索框的xpath地址 执行动作 获取cookie 保存为json文件 修改cookie的sameSite值并且导入cookie 导入cookie&#xff08;出错&#xff09; 导入cookie&#xff08;修改后&…...

【Fegin技术专题】「原生态」打开Fegin之RPC技术的开端,你会使用原生态的Fegin吗?(上)

前提介绍 Feign是SpringCloud中服务消费端的调用框架&#xff0c;通常与ribbon&#xff0c;hystrix等组合使用。由于遗留原因&#xff0c;某些项目中&#xff0c;整个系统并不是SpringCloud项目&#xff0c;甚至不是Spring项目&#xff0c;而使用者关注的重点仅仅是简化http调…...

React Native Vector Icons的使用

介绍 React Native Vector Icons是一个用于在React Native应用中使用矢量图标的库。它提供了许多常见的图标集&#xff0c;如FontAwesome、Ionicons等。 使用 首先&#xff0c;你需要在你的React Native项目中安装React Native Vector Icons库。可以使用以下命令进行安装&…...

Redis安装和配置(Linux)

一、安装准备 VMware虚拟机准备&#xff1a; https://www.vmware.com/cn/products/workstation-pro.html Centos7.0准备&#xff1a; https://www.centos.org/ 二、安装 安装好VMware以后&#xff0c;进入VMware,然后创建新的虚拟机 创建好虚拟机以后&#xff0c;进行安装C…...

安卓源码分析(10)Lifecycle实现组件生命周期管理

参考&#xff1a; https://developer.android.google.cn/topic/libraries/architecture/lifecycle?hlzh-cn#java https://developer.android.google.cn/reference/androidx/lifecycle/Lifecycle 文章目录 1、概述2、LifeCycle类3、LifecycleOwner类4、LifecycleObserver类 1、…...

IP 多播协议(IP Multicast Protocol)

IP 多播协议&#xff08;IP Multicast Protocol&#xff09;是一种在网络中一对多传输数据的通信方式。在传统的单播通信中&#xff0c;数据从一个发送方发送到一个接收方&#xff1b;而在多播通信中&#xff0c;数据可以从一个发送方传输到多个接收方&#xff0c;从而有效地节…...

Jmeter 配置环境变量,简明教程专享

通过给 JMeter 配置环境变量&#xff0c;可以快捷的打开 JMeter&#xff1a; 打开终端。执行 jmeter。 配置环境变量的方法如下。 Mac 和 Linux 系统 在 ~/.bashrc 中加如下内容&#xff1a; export JMETER_HOMEJMeter所在目录 export PATH$JAVA_HOME/bin:$PATH:.:$JMETER…...

WebService—XFire配置笔记

在学习之前,一直以为WebService就是一个工具,在两个服务器之间建立一个通信,帮我们把需要传输的数据组织成规范的XML数据并发送到目的地,实际情况也确实是这样的,不过更高级一点的是,XFire不但可以帮我们生成XML发送,而且可以在接收了xml之后还可以直接返回对象给我们用…...

【LangChain学习】基于PDF文档构建问答知识库(一)前期准备

这系列主要介绍如何使用LangChain大模型&#xff0c;结合ChatGPT3.5&#xff0c;基于PDF文档构建专属的问答知识库。 一、 环境搭建 LangChain 和 OpenAI 本身可支持 Nodejs 和 Python 两个版本&#xff0c;笔者后续的介绍主要用到Python版本&#xff0c;如果有需要Nodejs版本…...

Word(1):文章页码设置

1.需求 在文档的封皮页不设置页码&#xff0c;在目录页页码设置为罗马数字&#xff0c;在正文使用阿拉伯数字。 2.解决方法 step1&#xff1a; 在封皮页的最后&#xff0c;点击”插入“-分隔符-分节符&#xff08;下一页&#xff09; step2&#xff1a;在目录页的最后&…...

Linux MQTT智能家居(温度,湿度,环境监测,摄像头等界面布局设置)

文章目录 前言一、温度湿度曲线布局二、环境监测界面布局三、摄像头界面布局总结 前言 本篇文章来完成另外三个界面的布局设置。 这里会使用到 feiyangqingyun的一些控件库。 一、温度湿度曲线布局 TempHumtiy.h: #ifndef TEMPHUMTIY_H #define TEMPHUMTIY_H#include <…...

权衡与选择:如何巧妙管理项目需求的优先级

在项目管理领域&#xff0c;处理和管理需求可能是最具挑战性的环节之一。每一个项目都充满了各种需求&#xff0c;从业务需求到技术需求&#xff0c;从用户需求到系统需求。而如何有效地为这些需求排列优先级&#xff0c;不仅会影响项目的进度和资源分配&#xff0c;还会直接关…...

UGUI组件EventTrigger用法

一.Unity编辑器中EventTrigger组件用法 1.添加事件类型 2.绑定gameObject指定组件的方法 3.方法执行逻辑 public class NewBehaviourScript : MonoBehaviour {public void PointerDown(){Debug.Log("Trigger PointerDown");} } 4.按下鼠标&#xff0c;绑定方法成功…...

Visual Studio 2019 详细安装教程(图文版)

前言 Visual Studio 2019 安装包的下载教程、安装教程 教程 博主博客链接&#xff1a;https://blog.csdn.net/m0_74014525 关注博主&#xff0c;后期持续更新系列文章 ********文章附有百度网盘安装包链接********* 系列文章 第一篇&#xff1a;Visual Studio 2019 详细安装教…...

idea添加作者信息

idea添加作者信息 自定义作者信息idea添加作者信息自定义作者信息 自定义作者信息 idea添加作者信息 在idea中&#xff0c;经常会有这些波浪纹提示&#xff0c;放在上面之后会提示添加作者信息,点击添加作者信息后&#xff0c;但是不是自己想要的 这里提取的话好像没什么办法…...

后端开发6.权限控制模块

概述 权限控制采用springsecurity 数据库设计 用户表 DROP TABLE IF EXISTS `admin`; CREATE TABLE `admin` (`aid` int(32) NOT NULL AUTO_INCREMENT,`email` varchar(50) DEFAULT NULL,`username` varchar(50) DEFAULT NULL,`password` varchar(255) DEFAULT NULL,`phone…...

Golang原生实现JA3指纹修改,并支持Proxy代理

起因 抓取某个HTTPS网站的时候 开启charles代理能够抓取成功,关闭被风控 通过检测,怀疑可能是tls的时候有区别 尝试 golang的http中,Transport.TLSClientConfig是可以自定义设置的 但起初通过随意设置并不能绕过风控 困难 使用golang的http客户端,修改DialTLSContext函数的…...

一个案例:Vue2组件化开发组件从入门到入土

1. 环境搭建 1.1. 创建项目 npm install -g vue/clivue create vue_study_todolist1.2. 清空项目代码 清楚HelloWorld.Vue代码中的内容。 1.3. 启动空项目 1.4 项目目标 项目组件实现以下效果 2. 组件拆分代码 Vue是一个基于组件的框架&#xff0c;允许您将界面拆分成小的…...

2026奇点智能技术大会AIAgent代码生成全链路复盘(含GitHub私有Repo脱敏数据+VS Code插件配置清单)

第一章&#xff1a;2026奇点智能技术大会&#xff1a;AIAgent代码生成全景概览 2026奇点智能技术大会(https://ml-summit.org) 本届大会首次设立“AIAgent原生开发”主题展区&#xff0c;聚焦多模态提示理解、增量式代码合成、跨IDE运行时验证三大技术支柱。来自Google DeepM…...

Ever Gauzy:如何用开源ERP/CRM/HRM平台解决中小企业的管理难题

Ever Gauzy&#xff1a;如何用开源ERP/CRM/HRM平台解决中小企业的管理难题 【免费下载链接】ever-gauzy Ever Gauzy™ - Open Business Management Platform (ERP/CRM/HRM/ATS/PM) - https://gauzy.co 项目地址: https://gitcode.com/gh_mirrors/ev/ever-gauzy 面对业务…...

如何用Special Judge防止OnlineJudge中的作弊行为?实战案例分析

如何用Special Judge技术构建防作弊的在线判题系统 在编程竞赛和在线技术面试中&#xff0c;判题系统的公正性直接影响着选拔质量。我曾参与过多个在线判题系统(OJ)的搭建&#xff0c;发现最令人头疼的不是并发处理或判题效率&#xff0c;而是如何应对层出不穷的作弊手段。有一…...

异步电机直接转矩控制进阶:12扇区三电平SVPWM的仿真优化与实践

1. 异步电机直接转矩控制的核心痛点 我第一次接触异步电机直接转矩控制&#xff08;DTC&#xff09;是在2015年做电动汽车驱动项目时。当时团队使用传统两电平逆变器方案&#xff0c;电机运行时总伴随着明显的"嗡嗡"声&#xff0c;实测转矩波动幅度高达额定值的15%。…...

全球数据库各个细分领域的TOP1产品

文章目录一、关系型数据库(RDBMS)领域二、NoSQL数据库领域三、云原生数据库领域四、向量数据库(AI时代新兴)领域五、时间序列数据库领域六、NewSQL数据库领域七、数据仓库/OLAP领域八、嵌入式关系型数据库领域九、国产数据库市场格局十、发展趋势与洞察十一、数据库选型建议十二…...

开源文档迁移神器:feishu-doc-export如何3步解决企业知识库转移效率难题

开源文档迁移神器&#xff1a;feishu-doc-export如何3步解决企业知识库转移效率难题 【免费下载链接】feishu-doc-export 飞书文档导出服务 项目地址: https://gitcode.com/gh_mirrors/fe/feishu-doc-export 想象一下&#xff0c;你的公司要从飞书切换到企业微信&#x…...

开关电源噪声的成因分析与高效抑制策略

1. 开关电源噪声的物理成因 第一次拆解开关电源时&#xff0c;我被电路板上那些看似杂乱的波形吓到了。示波器上跳动的尖峰就像心电图失常的病人&#xff0c;这些就是让工程师们头疼的电源噪声。要解决它&#xff0c;我们得先搞明白这些"电子心电图异常"是怎么产生的…...

【无标题】第1章 分布式认知雷达网络与多智能体协同

目录 1.1 异构网络化感知架构 1.1.1 分布式相参阵列与频谱共生 1.1.2 频谱共享的势博弈模型 1.2 去中心化部分可观测马尔可夫决策过程(Dec-POMDP) 1.2.1 数学形式化 1.2.2 值分解网络(VDN)的可加性验证 1.3 MultiAgentRadarSim 仿真框架 1.4 验证与批判性分析 1.4.…...

【笔试真题】- 携程-2026.04.12

📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围在线刷题 bishipass.com 携程-2026.04.12 题目一:双仓配货 1️⃣:固定构造 4 和 2n-4 即可。 2️⃣:关键结论是所有不小于 4 的偶数都是合数。 难度:Low 题目二:灯带调色窗口 1️⃣…...

OpCore Simplify:让普通用户也能轻松完成黑苹果系统配置的终极指南

OpCore Simplify&#xff1a;让普通用户也能轻松完成黑苹果系统配置的终极指南 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify OpCore Simplify 是一款…...