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

MongoDB多数据源配置与切换

在MongoDB中配置和使用多数据源主要涉及以下几个步骤:

  1. 定义多个数据源的配置

    • 在应用程序的配置文件中,定义多个MongoDB的数据源,例如在Spring Boot中可以通过application.yml或application.properties文件进行配置。
  2. 创建多个MongoTemplate Bean

    • 使用Spring框架的Java配置类,创建多个MongoTemplate Bean,每个Bean对应一个数据源。
  3. 使用动态切换数据源的方式

    • 使用Spring的AOP(Aspect-Oriented Programming)或其他方法,在运行时根据需要动态切换数据源。

以下是一个Spring Boot应用中配置和切换多数据源的示例:

1. 配置文件 (application.yml)

spring:data:mongodb:primary:uri: mongodb://localhost:27017/primarydbsecondary:uri: mongodb://localhost:27017/secondarydb

2. Java配置类

import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.mongodb.core.MongoTemplate;@Configuration
public class MongoConfig {@Primary@Bean(name = "primaryMongoTemplate")public MongoTemplate primaryMongoTemplate() {MongoClient mongoClient = MongoClients.create("mongodb://localhost:27017/primarydb");return new MongoTemplate(mongoClient, "primarydb");}@Bean(name = "secondaryMongoTemplate")public MongoTemplate secondaryMongoTemplate() {MongoClient mongoClient = MongoClients.create("mongodb://localhost:27017/secondarydb");return new MongoTemplate(mongoClient, "secondarydb");}
}

3. 动态切换数据源

方法一:使用AOP动态切换数据源

你可以定义一个自定义注解,然后使用AOP在运行时切换MongoTemplate。

import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.stereotype.Component;@Aspect
@Component
public class DynamicDataSourceAspect {@Autowiredprivate ApplicationContext applicationContext;@Around("@annotation(UseDataSource)")public Object switchDataSource(ProceedingJoinPoint joinPoint) throws Throwable {MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();UseDataSource useDataSource = methodSignature.getMethod().getAnnotation(UseDataSource.class);MongoTemplate mongoTemplate = (MongoTemplate) applicationContext.getBean(useDataSource.value());try {MongoTemplateContextHolder.setMongoTemplate(mongoTemplate);return joinPoint.proceed();} finally {MongoTemplateContextHolder.clear();}}
}

定义注解和上下文持有者类:

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface UseDataSource {String value();
}public class MongoTemplateContextHolder {private static final ThreadLocal<MongoTemplate> CONTEXT = new ThreadLocal<>();public static void setMongoTemplate(MongoTemplate mongoTemplate) {CONTEXT.set(mongoTemplate);}public static MongoTemplate getMongoTemplate() {return CONTEXT.get();}public static void clear() {CONTEXT.remove();}
}

在使用时,通过注解指定数据源:

@Service
public class MyService {@Autowiredprivate MongoTemplate primaryMongoTemplate;@Autowiredprivate MongoTemplate secondaryMongoTemplate;@UseDataSource("primaryMongoTemplate")public void usePrimaryDataSource() {MongoTemplate mongoTemplate = MongoTemplateContextHolder.getMongoTemplate();// 使用primaryMongoTemplate进行操作}@UseDataSource("secondaryMongoTemplate")public void useSecondaryDataSource() {MongoTemplate mongoTemplate = MongoTemplateContextHolder.getMongoTemplate();// 使用secondaryMongoTemplate进行操作}
}
方法二:直接在代码中切换数据源

你也可以直接在代码中注入多个MongoTemplate,并根据需要选择使用。

@Service
public class MyService {@Autowiredprivate MongoTemplate primaryMongoTemplate;@Autowiredprivate MongoTemplate secondaryMongoTemplate;public void someMethod(boolean usePrimary) {MongoTemplate mongoTemplate = usePrimary ? primaryMongoTemplate : secondaryMongoTemplate;// 使用mongoTemplate进行操作}
}

这种方法比较简单直接,但需要在代码中显式选择数据源,适用于数据源切换逻辑较简单的场景。

相关文章:

MongoDB多数据源配置与切换

在MongoDB中配置和使用多数据源主要涉及以下几个步骤&#xff1a; 定义多个数据源的配置&#xff1a; 在应用程序的配置文件中&#xff0c;定义多个MongoDB的数据源&#xff0c;例如在Spring Boot中可以通过application.yml或application.properties文件进行配置。 创建多个Mo…...

Mongodb入门介绍

文章目录 1、Mongodb&#xff1a;NoSQL数据库&#xff0c;分布式的文档型数据库2、适合场景&#xff1a;3、不适合场景&#xff1a;4、概念5、总结 1、Mongodb&#xff1a;NoSQL数据库&#xff0c;分布式的文档型数据库 2、适合场景&#xff1a; 1、web网站数据存储&#xff…...

docker前端部署

挂载&#xff0c;把自己的目录位置&#xff0c;挂载到容器内的HTML...

指标体系建设的方法论

一、分析痛点 了解当前数仓侧与业务应用方对指标到不到、难使用的痛点及日常指标使用习惯&#xff0c;制定指标中心所需功能并设计指标中心样式。 二、指定指标规范 定义指标类型、指标使用方、确定指标域(这里是数据域)、指标要具备的属性(业务/技术口径、负责人、类型等)。 …...

乐鑫ESP32-H2设备联网芯片,集成多种安全功能方案,启明云端乐鑫代理商

在数字化浪潮的推动下&#xff0c;物联网正以前所未有的速度融入我们的日常生活。然而&#xff0c;随着设备的激增&#xff0c;安全问题也日益成为公众关注的焦点。 乐鑫ESP32-H2致力于为所有开发者提供高性价比的安全解决方案&#xff0c;这款芯片经过专门设计以集成多种安全…...

C++调用Java接口

一、配置Java环境 安装jdk&#xff0c;我这里使用jdk1.8 32位版本&#xff0c;下载地址&#xff1a;https://www.oracle.com/java/technologies/downloads/#java8-windows 下载安装后&#xff0c;设置环境变量&#xff1a; JAVA_HOME C:\Program Files (x86)\Java\jdk-1.…...

C# datetimePicker

1. 直接把控件拉到设计器中&#xff0c;此时不要调整控件的values属性&#xff0c;这样就可以 打开后每次默认显示当天日期。 2. 属性Format long长日期格式默认值short短日期格式Time时间格式custom自定义时间格式在customFormat这个属性设置&#xff0c;比如yyyy-MM-dd HH…...

AI有关的学习和python

一、基本概念 AIGC&#xff08;AI Generated content AI 生成内容&#xff09; AI生成的文本、代码、图片、音频、视频。都可以成为AIGC。 Generative AI&#xff08;生成式AI&#xff09;所生成的内容就是AIGC AI指代计算机人工智能&#xff0c;模仿人类的智能从而解决问题…...

前端node.js入门

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 Node.js 入门概览 什么是Node.js&#xff1f; 为什么选择Node.js&#xff1f; 基础安装与环境配置 安装…...

无需标注的数据集

0&#xff1a;人 1&#xff1a;自行车 2&#xff1a;汽车 3&#xff1a;摩托车 4&#xff1a;飞机 5&#xff1a;公交车 6&#xff1a;火车 7&#xff1a;卡车 8&#xff1a;船 9&#xff1a;交通信号灯 10&#xff1a;消火栓 11&#xff1a;停车标志 12&#xff1a;停车计时器…...

C# 抽象工厂模式

栏目总目录 概念 抽象工厂模式是一种创建型设计模式&#xff0c;它提供了一种创建一系列相关或相互依赖对象的接口&#xff0c;而无需指定它们具体的类。在抽象工厂模式中&#xff0c;一个抽象的工厂类负责定义创建产品对象的接口&#xff0c;但是具体工厂类将负责创建具体的产…...

java中 两个不同类对象list,属性一样,如何copy

如果您有两个不同的类&#xff0c;但它们拥有相同的属性&#xff0c;并且您想要从一个类的列表复制到另一个类的列表&#xff0c;您可以使用以下方法&#xff1a; 使用循环&#xff1a; 您可以遍历原始列表&#xff0c;并为每个元素创建目标类的新实例。 使用 Stream API&…...

文件上传总结

一、原理 通过界面上的上传功能上传了一个可执行的脚本文件&#xff0c;而WEB端的系统并未对其进行检测或者检测的逻辑做的不够好&#xff0c;使得恶意用户可以通过文件中上传的一句话木马获得操控权 二、绕过方法 1>前端绕过 1.删除前端校验函数 checkFile() 2.禁用js…...

网页突然被恶意跳转或无法打开?DNS污染怎么解决?

前言 在网上冲浪时&#xff0c;我们时常会遭遇DNS污染这一区域性攻击&#xff0c;几乎无人能幸免。受影响时&#xff1a;尝试访问正规网站可能会被错误导向赌博、色情或其他恶意站点。 1.我们为什么需要DNS 当我们想要访问一个网站时&#xff0c;就像拨打朋友的电话号码一样…...

Matlab进阶绘图第65期—带分组折线段的柱状图

带分组折线段的柱状图是在原始柱状图的基础上&#xff0c;在每组柱状图位置处分别添加折线段&#xff0c;以进行对比或添加额外信息。 由于Matlab中未收录带分组折线段的柱状图的绘制函数&#xff0c;因此需要大家自行设法解决。 本文使用自制的BarwithGroupedLine小工具进行…...

EasyMedia转码rtsp视频流flv格式,hls格式,H5页面播放flv流视频

在本文中&#xff0c;我们将介绍如何使用 EasyMedia 将 RTSP 视频流转码为 FLV 和 HLS 格式&#xff0c;并在 H5 页面上播放 FLV 流视频。EasyMedia 是一个支持多种流媒体协议的开源项目&#xff0c;非常适合用于这种转码和流媒体传输的场景。 前提条件 已经安装并配置好 Eas…...

FPGA实验6: 有时钟使能两位十进制计数器的设计

一、实验目的与要求 1.. 熟练掌握使用原理图设计较复杂电路&#xff1b; 2. 学习原理图设计中总线的表示以及使用方法。 二、实验原理 运用Quartus II 集成环境下的图形设计方法设计有时钟使能的两位十进制计数器。进行波形仿真和分析、引脚分配并下载到实验设备上进行功能…...

C# 委托函数 delegate

在C#中&#xff0c;委托&#xff08;Delegate&#xff09;是一种特殊的类型&#xff0c;它可以持有对方法的引用。 委托是实现事件的基础。事件本质上是多播委托&#xff0c;允许多个方法被触发 委托允许你将方法作为参数传递给其他方法&#xff0c;或者将方法作为返回值从方法…...

Vue3响应式高阶用法之`shallowReadonly()`

Vue3响应式高阶用法之shallowReadonly() 在现代前端开发中&#xff0c;Vue3 提供了丰富的响应式 API 来帮助开发者更高效地管理状态和数据。其中&#xff0c;shallowReadonly() 是一个非常有用的工具&#xff0c;适用于需要部分只读状态的场景。本文将详细介绍 shallowReadonl…...

Windows系统安全加固方案:快速上手系统加固指南 (下)

这里写目录标题 一、概述二、IP协议安全配置启用SYN攻击保护 三、文件权限3.1 关闭默认共享3.2 查看共享文件夹权限3.3 删除默认共享 四、服务安全4.1禁用TCP/IP 上的NetBIOS4.2 ### 禁用不必要的服务 五、安全选项5.1启动安全选项5.2禁用未登录前关机 六、其他安全配置**6.1防…...

vLLM-v0.17.1参数详解:--disable-log-stats与--log-level日志调优

vLLM-v0.17.1参数详解&#xff1a;--disable-log-stats与--log-level日志调优 1. vLLM框架简介 vLLM是一个专为大型语言模型(LLM)设计的高性能推理和服务库&#xff0c;以其出色的吞吐量和易用性著称。这个项目最初由加州大学伯克利分校的天空计算实验室开发&#xff0c;现在…...

ARMv8开发实战:Aarch64函数调用那些坑(含AAPCS64避坑指南)

ARMv8开发实战&#xff1a;Aarch64函数调用那些坑&#xff08;含AAPCS64避坑指南&#xff09; 在嵌入式开发和系统编程领域&#xff0c;ARMv8架构因其出色的能效比和性能表现&#xff0c;已经成为移动设备、服务器甚至超级计算机的主流选择。然而&#xff0c;当开发者从x86平台…...

从LLaVA到Stable Diffusion:多模态融合选拼接还是交叉注意力?一张图帮你做技术选型

多模态融合技术选型指南&#xff1a;拼接与交叉注意力的深度对比与实践策略 在构建现代多模态AI系统时&#xff0c;工程师们常常面临一个关键决策点&#xff1a;如何有效地融合来自不同模态的信息&#xff1f;想象一下&#xff0c;你正在开发一个智能医疗影像分析系统&#xff…...

Fast-GitHub:突破网络瓶颈的开发效率工具解决方案

Fast-GitHub&#xff1a;突破网络瓶颈的开发效率工具解决方案 【免费下载链接】Fast-GitHub 国内Github下载很慢&#xff0c;用上了这个插件后&#xff0c;下载速度嗖嗖嗖的~&#xff01; 项目地址: https://gitcode.com/gh_mirrors/fa/Fast-GitHub 1 痛点直击&#xff…...

Mojo+Python混合部署案例深度拆解(从Jupyter到生产环境的无缝迁移全路径)

第一章&#xff1a;MojoPython混合部署案例深度拆解&#xff08;从Jupyter到生产环境的无缝迁移全路径&#xff09;Mojo 作为新兴的系统级编程语言&#xff0c;与 Python 生态天然兼容&#xff0c;为机器学习模型从探索性开发&#xff08;Jupyter Notebook&#xff09;迈向高吞…...

嵌入式开源软件应用的五项关键实践

嵌入式开源软件应用的五项关键实践1. 开源软件在嵌入式系统中的价值与挑战开源软件已成为现代嵌入式系统开发的重要组成部分。通过合理利用开源组件&#xff0c;开发团队可以显著缩短开发周期&#xff0c;降低研发成本&#xff0c;同时获得经过社区验证的可靠解决方案。然而&am…...

Jable视频下载终极指南:3步免费保存你喜欢的视频内容

Jable视频下载终极指南&#xff1a;3步免费保存你喜欢的视频内容 【免费下载链接】jable-download 方便下载jable的小工具 项目地址: https://gitcode.com/gh_mirrors/ja/jable-download jable-download是一款专为Jable.tv视频平台设计的免费下载工具&#xff0c;通过Ch…...

AD21实战:3种方法搞定Keepout和机械层互转,最后一种能救急

AD21实战&#xff1a;3种高效解决Keepout与机械层互转难题的方法 在PCB设计过程中&#xff0c;Keepout层和机械层的正确使用与转换是确保设计准确性的关键环节。许多工程师都遇到过这样的困境&#xff1a;当设计文件中包含复杂图形元素时&#xff0c;简单的层切换或属性批量修…...

2026 AI大模型岗位薪资全曝光:从30k到80w,程序员必备指南,非常详细收藏我这一篇就够了

文章主要展示了2026年AI领域热门岗位的薪资情况&#xff0c;包括华为、腾讯、联影等公司在多个城市的AI工程师、大模型算法等职位的薪资水平。数据显示AI人才市场需求旺盛&#xff0c;薪资从月薪3.6万到年包80万不等。文章提供了AI薪资专场的链接&#xff0c;邀请读者了解更多行…...

MarkDownload:让网页转Markdown变得简单高效的浏览器扩展

MarkDownload&#xff1a;让网页转Markdown变得简单高效的浏览器扩展 【免费下载链接】markdownload A Firefox and Google Chrome extension to clip websites and download them into a readable markdown file. 项目地址: https://gitcode.com/gh_mirrors/ma/markdownload…...