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进行操作}
}

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/875837.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习小型gpt源码(自用)

数据集构建_哔哩哔哩_bilibili &#xff08;b站上有一系列课&#xff0c;从数据处理到模型构建和训练使用&#xff09; 什么是batch&#xff1f; 为什么一个batch内的句子要一样长&#xff1f; 不同batch的长度可以不一样&#xff0c;但是同一个batch内长度一样&#xff01;…

【MySQL进阶之路 | 高级篇】数据操作类型的角度理解共享锁,排他锁

1. 从数据操作的类型划分&#xff1a;读锁&#xff0c;写锁 对于数据库并发事务的读-读情况并不会引起什么问题。对于写-写&#xff0c;读-写操作或写-写操作这些情况可能会引起一些问题&#xff0c;需要使用MVCC或者加锁的方式来解决它们。在使用加锁的方式解决问题时&#x…

Vue3点击按钮实现跳转页面并携带参数

前提&#xff1a;有完整的路由规则 1.源页面 <template><div><h1>源页面</h1><!--通过js代码跳转--><template #default"scope"><button click"toTargetView(scope.row)">点击跳转携带参数</button><…

动态超参数优化:在Mojo模型中实现自定义搜索的艺术

动态超参数优化&#xff1a;在Mojo模型中实现自定义搜索的艺术 在机器学习领域&#xff0c;超参数的调整是提高模型性能的关键步骤。Mojo模型&#xff0c;作为机器学习模型的泛称&#xff0c;通常需要通过调整超参数来达到最优状态。然而&#xff0c;传统的超参数搜索方法往往…

3.3-LSTM的改进

文章目录 1改进点1.1多层化1.2 dropout1.2.1具体概念1.2.2应该插入到LSTM模型的哪里 1.3权重共享 2改进之后的LSTMLM的代码实现2.1初始化2.2前向计算2.3反向传播 3相应的学习代码的实现4总结 1改进点 1.1多层化 加深神经网络的层数往往能够学习更复杂的模式&#xff1b;因此这…

NOI大纲——普及组——素数筛法

素数筛的进化史 1.最为基础的筛法——试除法 时间复杂度 O ( n 2 ) O(n^2) O(n2) int a[10000],tot0,n; for (int i2;i<n;i){bool flagfalse;for (int j2;j<i;j){if (i%j0)flagtrue;}if (flagfalse){a[tot]i;tot;} } for (int i0;i<tot;i){cout<<a[i]<&l…

【0-1 架构问题集合】

常见问题 大数据量高并发情况下如何更新缓存二级目录三级目录 大数据量高并发情况下如何更新缓存 首先是查询的时候&#xff0c;一般先查询缓存&#xff0c;在查询数据库&#xff0c;同步的去更新缓存但是都是异步去更新&#xff0c;引入消息队列MQ 本质是个队列&#xff0c;F…

JVM之经典垃圾收集器

目录 Serial收集 ParNew收集器 Parallel Scavenge收集器 Serial Old收集器 Parallel Old收集器 CMS垃圾收集器&#xff08;重点&#xff09;&#xff1a; Garbage First 收集器&#xff08;重点&#xff09;&#xff1a; Serial收集 使用一个处理器或一条收集线程去完成垃…

利用换元法计算积分的常见题型(考研高数复习)

考研中常见的几种换元法积分计算题 (1)被积式仅包含一个根式&#xff1a;根号下为有 a a a 和 x x x 的平方和/平方差 此种类型的积分题型&#xff0c;可以通过构造单个锐角大小为 t t t 的直角三角形&#xff0c;利用勾股定理和三角函数进行代换。 平方和的情况 形如 ∫…

Java高级工程师应该怎样准备笔试?

哈哈&#xff0c;大早上&#xff0c;有个粉丝问&#xff1a;Java高级工程师应该怎样准备笔试&#xff1f; 这问题还真是小意思啊。Java高级工程师的笔试怎么准备&#xff1f;你问得好&#xff01;咱们混迹江湖这么久&#xff0c;什么风浪没见过&#xff0c;面试笔试这些东西&a…

Java:swagger/knife4j接口返回的json数据中文显示乱码问号???

目录 问题描述问题解决参考文章 问题描述 正常接口的中文返回是正确的 而只要发生异常处理&#xff0c;就会使用全局统一异常处理&#xff0c;输出包含中文字符的json字符串&#xff0c;发现&#xff0c;全都变成了问号?????? /*** 统一异常处理*/ ControllerAdvice Sl…

java学习----注释

简介 override介绍&#xff1a; 添加了这个注释其实是做了个语法校验的作用 override定义 Deprecated介绍&#xff1a; 源码&#xff1a; SuppressWarnings介绍&#xff1a; 源码&#xff1a; 元注解 Retention注解介绍&#xff1a; 案列 Target注解介绍&#xff1a; Documente…

LLM - 理解 Transformer 的位置编码 sin cos 的作用与原理

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/140697827 免责声明:本文来源于个人知识与公开资料,仅用于学术交流,欢迎讨论,不支持转载。 Transformer 模型中的位置编码是关键技术,通过为每个词嵌入向量添加位…

数据库第五次作业

1. 触发器 建立触发器&#xff0c;订单表中增加订单数量后&#xff0c;商品表商品数量同步减少对应的商品订单出数量,并测试 建立触发器&#xff0c;实现功能:客户取消订单&#xff0c;恢复商品表对应商品的数量 建立触发器&#xff0c;实现功能:客户修改订单&#xff0c;商品…

【微软蓝屏】微软Windows蓝屏问题汇总与应对解决策略

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

分布式:保证分布式事务的一致性

文章目录 保证分布式事务的一致性XA协议两阶段提交TCC模式SAGA模式 本篇开始进行分布式的学习&#xff0c;由于时间原因&#xff0c;我也没有过多时间深入学习&#xff0c;因此打算在有时间就进行这块内容的学习&#xff0c;学习的切入点也是从一些问题开始进行切入学习吧 保证…

2024年铜川宜君半程马拉松,暴晒+爬坡152安全完赛

1、赛事背景 2024年7月21日&#xff0c;我参加了2024年铜川宜君半程马拉松赛&#xff0c;7月举办的赛事很少&#xff0c;全国都算温度比较高的&#xff0c;虽然宜君是一个山城&#xff0c;还是会担心气温会高。 临开赛1、2周&#xff0c;陕西区域降水比较多&#xff0c;赛前一…

【算法专题】双指针算法之LCR 179. 查找总价格为目标值的两个商品(力扣)

欢迎来到 CILMY23的博客 &#x1f3c6;本篇主题为&#xff1a;双指针算法之LCR 179. 查找总价格为目标值的两个商品&#xff08;力扣&#xff09; &#x1f3c6;个人主页&#xff1a;CILMY23-CSDN博客 &#x1f3c6;系列专栏&#xff1a;Python | C | C语言 | 数据结构与算法…

使用nginx解决本地环境访问线上接口跨域问题

前言 前端项目开发过程中&#xff0c;经常会遇到各种各样的跨域问题。 虽然大部分时候&#xff0c;由脚手架自带的proxy功能即可解决问题&#xff0c;如webpack&#xff0c;vite等&#xff1b;但是若没有通过脚手架搭建项目&#xff0c;或者必须使用某些特殊规则转发时&#…

了解光耦合器从基础到应用

光耦合器也称为光电耦合器&#xff0c;是一种利用光信号传递电信号的电子元器件。它广泛应用于各种电子设备和电路中&#xff0c;因其在隔离电气信号、提高抗干扰能力方面的独特优势&#xff0c;备受工程师们的青睐。本文将为光耦爱好者和高级工程师提供一份有关光耦合器的知识…