SpringBoot动态切换多数据源

【SpringBoot2.0系列06】SpringBoot之多数据源动态切换数据源 【SpringBoot2.0系列01】初识SpringBoot 【SpringBoot2.0系列02】SpringBoot之使用Thymeleaf视图模板 【SpringBoot2.0系列03】SpringBoot之使用freemark视图模板 【SpringBoot2.0系列04】SpringBoot之使用JPA完成简单的rest api 【SpringBoot2.0系列05】Sprin... 阅读详情

问题引入

在大型分布式项目中,经常会出现多数据源的情况,比如说mysql结合sqlServer、Oracle等进行数据存储,此时就需要我们通过Spring配值多数据源,在项目中根据实际进行动态切换,按相应的数据库进行CRUD操作。

难点所在

由于项目中的Bean基本都为单例模式,此时如果大量用户不断切换数据库,改变dataSource,会造成严重的资源掠夺问题,显然,此时解决方案有两个思路,一是:以空间换取时间,二是:以时间换区空间。
首先第一种解决方法很简单,在修改dataSource上加入Synchronized,但在高并发环境下是完全不合理的,很影响性能;
而第二种解决方法较为灵活,以“空间换时间”,为每一个线程提供一份变量(利用ThreadLocal),因此可以同时访问并互不干扰。
废话不多说,直接看实现方法!

具体方法

创建SpringBoot项目,pom.xml如下

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.1.6.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.capol</groupId>
	<artifactId>multidatasource</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>multidatasource</name>
	<description>Demo project for Spring Boot</description>

	<properties>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter</artifactId>
		</dependency>
		<dependency>
			<groupId>com.microsoft.sqlserver</groupId>
			<artifactId>sqljdbc4</artifactId>
			<version>4.0</version>
		</dependency>
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.46</version>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>druid-spring-boot-starter</artifactId>
			<version>1.1.16</version>
		</dependency>
		<dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
			<version>1.3.2</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-aop</artifactId>
		</dependency>

		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis</artifactId>
			<version>3.4.1</version>
		</dependency>
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>druid</artifactId>
			<version>1.1.9</version>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

在application.yml中进行如下配置

spring:
  datasource:
    sqlserver:
      driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
      jdbc-url: 
      username: 
      password: 
    mysql:
      driver-class-name: com.mysql.jdbc.Driver
      jdbc-url: 
      username: 
      password: 

    druid:
      db-type: com.alibaba.druid.pool.DruidDataSource

首先定义一个数据库的枚举类

package com.capol.multidatasource.config;

/**
 * @author fuzihao
 * @date 2019/7/26 16:08
 */
public enum DataSourceEnum {
    MYSQL_DATASOURCE,
    SQLSERVER_DATASOURCE
}

其次,有如下的类,持有数据库连接对象与线程中,需要使用ThreadLocal

package com.capol.multidatasource.config;

/**
 * @author fuzihao
 * @date 2019/7/26 15:38
 */
public class DataSourceContextHolder {

    /**
     * 通过ThreadLocal保证线程安全
     */
    private static final ThreadLocal<DataSourceEnum> contextHolder = new ThreadLocal<>();

    /**
     * 设置数据源变量
     * @param dataSourceEnum 数据源变量
     */
    public static void setDataBaseType(DataSourceEnum dataSourceEnum) {
        System.out.println("修改数据源为:" + dataSourceEnum);
        contextHolder.set(dataSourceEnum);
    }

    /**
     * 获取数据源变量
     * @return 数据源变量
     */
    public static DataSourceEnum getDataBaseType() {
        DataSourceEnum dataSourceEnum = contextHolder.get() == null ? DataSourceEnum.MYSQL_DATASOURCE : contextHolder.get();
        System.out.println("当前数据源的类型为:" + dataSourceEnum);
        return dataSourceEnum;
    }

    /**
     * 清空数据类型
     */
    public static void clearDataBaseType() {
        contextHolder.remove();
    }

}

同时sqlSessionFactory需要一个DynamicDataSource,其继承至AbstractRoutingDatasource,如下

package com.capol.multidatasource.config;

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

/**
 * @author fuzihao
 * @date 2019/7/26 14:58
 */
public class DynamicDataSource extends AbstractRoutingDataSource {
    @Override
    protected Object determineCurrentLookupKey() {
        return DataSourceContextHolder.getDataBaseType();
    }

}

此时就可以注入各Bean了

package com.capol.multidatasource.config;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;

/**
 * @author fuzihao
 * @date 2019/7/26 14:43
 */
@Configuration
public class DataSourceConfig {
    @Bean(name = "sqlserverDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.sqlserver")
    public DataSource getDateSource1() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "mysqlDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.mysql")
    public DataSource getDateSource2() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "dynamicDataSource")
    public DynamicDataSource DataSource(@Qualifier("sqlserverDataSource") DataSource sqlserverDataSource,
                                        @Qualifier("mysqlDataSource") DataSource mysqlDataSource) {
        //配置多数据源
        Map<Object, Object> targetDataSource = new HashMap<>();
        targetDataSource.put(DataSourceEnum.SQLSERVER_DATASOURCE, sqlserverDataSource);
        targetDataSource.put(DataSourceEnum.MYSQL_DATASOURCE, mysqlDataSource);
        DynamicDataSource dataSource = new DynamicDataSource();
        //多数据源
        dataSource.setTargetDataSources(targetDataSource);
        //默认数据源
        dataSource.setDefaultTargetDataSource(mysqlDataSource);
        return dataSource;
    }
    @Bean(name = "SqlSessionFactory")
    public SqlSessionFactory test1SqlSessionFactory(@Qualifier("dynamicDataSource") DataSource dynamicDataSource)
            throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dynamicDataSource);
        return bean.getObject();
    }
}

由于mysql数据库中有一个t_blog表,故我在这里简单写了下mapper和entity:

package com.capol.multidatasource.mapper;

import com.capol.multidatasource.entity.Blog;
import org.apache.ibatis.annotations.Select;

/**
 * @author fuzihao
 * @date 2019/7/26 15:47
 */
public interface UserMapper {
    @Select("select pk_t_blog as id,f_author as author from t_blog where pk_t_blog=#{id}")
    Blog selectBlog(Integer id);
}
package com.capol.multidatasource.entity;

/**
 * @author fuzihao
 * @date 2019/7/26 15:46
 */
public class Blog {
    private Integer id;
    private String author;

	//getter and setter
}

此时就也可以在测试类中进行测试了:

package com.capol.multidatasource;

import com.capol.multidatasource.config.DataSourceContextHolder;
import com.capol.multidatasource.config.DataSourceEnum;
import com.capol.multidatasource.entity.Blog;
import com.capol.multidatasource.mapper.UserMapper;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;


@RunWith(SpringRunner.class)
@SpringBootTest
@MapperScan(basePackages = "com.capol.multidatasource.mapper")
public class MultidatasourceApplicationTests {

	@Autowired
	@Qualifier("SqlSessionFactory")
	private SqlSessionFactory sqlSessionFactory;
	@Autowired
	private UserMapper userMapper;
	@Test
	public void contextLoads() {
		Blog blog = userMapper.selectBlog(1);
		System.out.println(blog);
	}
}

此时输出实体类对象,若在config中设置默认为sqlServer数据库,或者在测试中插入

DataSourceContextHolder.setDataBaseType(DataSourceEnum.SQLSERVER_DATASOURCE);

发现会报错找不到 t_blog 表,配置成功!

知识扩展1

为了方便我们在Mapper中切换各数据库,可以通过注解和AOP的方式来实现数据源的切换。

首先定义一个注解类:

package com.capol.multidatasource.config;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 自定义数据源注解,默认为mysql数据源
 * @author fuzihao
 * @date 2019/7/26 16:26
 */
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface DataSourceAnno {
    DataSourceEnum value() default DataSourceEnum.MYSQL_DATASOURCE;
}

其次,给注解切面

package com.capol.multidatasource.config;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

/**
 * @author fuzihao
 * @date 2019/7/26 16:27
 */
@Aspect
@Component
public class DynamicDataSourceAspect {
    @Around("@annotation(dataSourceAnno)")
    public Object aroudOperDeal(ProceedingJoinPoint point,DataSourceAnno dataSourceAnno) throws Throwable {
        DataSourceContextHolder.setDataBaseType(dataSourceAnno.value());
        // 让目标方法继续进行
        Object retVal=point.proceed();
        DataSourceContextHolder.clearDataBaseType();
        return retVal;
    }
}

此时,我们就可以在mapper中,在相应数据库的curd操作上加上此注解,修改对应数据源啦!

知识扩展2

为什么最后需要contextHolder.remove();
首先看下Thread、ThreadLocalMap、ThreadLocal之间的关系
在这里插入图片描述Thread类有属性变量threadLocals,也就是说每个线程有一个自己的ThreadLocalMap (具体表现即为图中的各个Entry),所以每个线程往这个ThreadLocal中读写隔离的,并且是互相不会影响的。
一个ThreadLocal只能存储一个Object对象,如果需要存储多个Object对象那么就需要多个ThreadLocal!!!
在这里插入图片描述
可以看到Entry的key指向ThreadLocal为虚线,即表示弱引用

  • 弱引用也是用来描述非必需对象的,当JVM进行垃圾回收时,无论内存是否充足,该对象仅仅被弱引用关联,那么就会被回收。

即如果一个ThreadLocal没有外部强引用来引用它,那么系统 GC 的时候,这个ThreadLocal势必会被回收,这样一来,ThreadLocalMap中就会出现key为null的Entry,就没有办法访问这些key为null的Entry的value,如果当前线程再迟迟不结束的话,这些key为null的Entry的value就会一直存在一条强引用链:Thread Ref -> Thread -> ThreaLocalMap -> Entry -> value永远无法回收,造成内存泄漏。

  • 如果线程对象不被回收的情况,这就发生了真正意义上的内存泄露。比如使用线程池的时候,线程结束是不会销毁的,会再次使用的。就可能出现内存泄露。

解决方法

每次使用完ThreadLocal都调用它的remove()方法清除数据;

  • remove作用?
    remove方法会把这个key对应Entry的值设为空

或者按照JDK建议将ThreadLocal变量定义成private static,这样就一直存在ThreadLocal的强引用,也就能保证任何时候都能通过ThreadLocal的弱引用访问到Entry的value值,进而清除掉。
所以,最佳实践做法应该为:

public class XXX{
	private static ThreadLocal<Integer> threadlocal=new ThreadLocal<>();
	try{
		...
	}
	finally{
		threadlocal.remove();
	}
}

这也解释了为什么我们需要在最后进行contextHolder.remove()。

SpringBoot+MybatisPlus多数据源动态切换 公司某项目做大屏展示,但数据来源自7个不同的数据库,需要涉及跨库查询,要求。 本项目采用SpringBoot+MybatisPlus做服务端提供RESTful接口,前后端分离开发,总结一下项目中实现的动态数据源切换的实现方式。 首先在application文件中配置数据源 spring: aop: proxy-target-class: true auto: true... 阅读详情

相关推荐

springboot动态添加多数据源及切换

目录使用场景基本架构项目实现项目结构yml配置maven配置DataSource控制Aspect实现配置控制数据库操作service实现controller实现运行结果结语 使用场景 在需要动态添加不同的数据源的情况下,动态完成多数据源的切换,可以切换不同的数据库(如mysql、sqlserver等),不同数据库之间的表结构也允许不同。 基本架构 基于springboot2.3.4开发,通过aop完成多数据源的切换,通过继承AbstractRoutingDataSource类完成数据源的动态切换基础,以be

纯白的博客 2719

SpringBoot多数据源动态切换,不影响业务逻辑正常运行,服务高可用

SpringBoot多数据源动态切换,不影响业务逻辑正常运行,服务高可用 本文使用Spring Boot 2.4.10版本和MyBatis实现多数据源动态切换,当主库MySQL宕机后自动切换到容灾PostgreSQL数据库。 数据库及数据表示例如下: MySQL数据库(主库): 创建goodsdb数据库,创建book_t数据表并初始化数据。 DROP TABLE IF EXISTS book_t; CREATE TABLE book_t ( book_id INT PRIMARY KEY AUTO_IN

liwenyang1992的专栏 1993

STDP实战:用PyTorch从零搭建脉冲神经网络(附完整代码)

本文提供了基于PyTorch从零搭建脉冲神经网络的实战教程,重点讲解了STDP学习规则的原理与工程实现。通过构建LIF神经元模型和向量化STDP层,并结合泊松编码,详细演示了如何构建一个能够进行无监督特征学习的混合网络架构,为探索神经形态计算和低功耗实时学习方案提供了完整代码与实践指南。

weixin_29056145的博客 266

Spring动态切换多数据源解决方案

Spring动态配置多数据源,即在大型应用中对数据进行切分,并且采用多个数据库实例进行管理,这样可以有效提高系统的水平伸缩性。而这样的方案就会不同于常见的单一数据实例的方案,这就要程序在运行时根据当时的请求及系统状态来动态的决定将数据存储在哪个数据库实例中,以及从哪个数据库提取数据。 Spring配置多数据源的方式和具体使用过程。Spring对于多数据源,以数据库表为参照...

weixin_30383279的博客 240

从PSDK到ROS节点:实战GPS数据发布与CMake配置

本文详细介绍了如何从大疆PSDK获取GPS数据并封装为ROS节点的实战过程,包括PSDK编译、GPS数据订阅、ROS节点实现及CMake配置优化。通过具体代码示例和调试技巧,帮助开发者快速实现无人机传感器数据与ROS系统的集成,提升开发效率。

weixin_30843605的博客 458

WorkBuddy Skill赋能HYSYS与Comsol:AI工作台下的仿真自动化实践

AI Agent正将工业软件自动化带向新高度。在工程仿真领域,流程模拟与多物理场分析常因重复性操作而效率低下,Aspen HYSYS的批量工况调整、Comsol的参数扫描与网格重构均属此类。WorkBuddy这类AI工作台通过Skill将软件二次开发能力封装为可插拔技能包,利用HYSYS的COM/OLE接口和Comsol的Java API,实现自然语言指令到自动化执行的转变。其技术价值在于降低自动化门槛、沉淀工程经验,并支持日志审计与异常重试。在实际应用中,无论化工流程的灵敏度分析,还是激光焊接、移动网格等

weixin_29055699的博客 301

SpringBoot配置多数据源

SpringBoot配置多数据源总结 1.为何配置多数据源? 首先,当一个系统需要集成多个项目的时候,配置多数据源是不可避免的,比如在一个系统中,需要有主从库的配置(主库负责增删改,从库负责查询),或者当你的系统/服务需要对接多个系统,存入多个不同的表的时候,就需要配置多数据源。 P.S 也可以在服务中调用RPC通信去调用别的服务的方法去调用多数据源,但是这样有以下几个弊端: (1)不同服务会有不同的git分支,当大家合作开发时,分支不同,而你的代码要去别人的服务里做修改,这样会导致一些版本和代码的冲突,不

qq_43540133的博客 1728

国产大模型编程能力深度分析报告(2026年5月更新版)

2026年5月国产大模型编程能力报告显示,主流模型迎来重大升级。DeepSeek V4以1.6T参数创性能新高,Qwen3.6-Plus支持原生多模态编程,MiniMax M2.7转向闭源并优化Agent编码,Kimi K2.6成为商业化成熟的主力模型,GLM-5开源并涨价30%。阿里云百炼推出双轨订阅体系,区分团队和个人开发者需求。各模型在参数规模、上下文长度、性能表现和适用场景上各具优势,国产AI编程服务正加速向订阅制转型,成本效益显著提升。

Willin Wang 的全栈升级指南 1653

Spring boot 使用@DS 配合druid连接池切换数据源及切换数据源失效情况

Spring boot 使用@DS 配合druid连接池切换数据源及切换数据源失效情况

壮乡码农 1万+

用4690张图片搞定物流仓储难题:手把手教你训练YOLOv8纸箱检测模型(附完整源码)

本文详细介绍了如何利用YOLOv8目标检测技术解决物流仓储中的纸箱识别难题。通过4690张图片构建高质量数据集,提供完整的训练教程和源码,实现98.7%的mAP@0.5准确率。文章涵盖数据采集、模型训练、调参技巧到边缘计算部署的全流程,帮助读者快速构建智能仓储检测系统。

weixin_28717939的博客 377

【26美赛F题 To Gen-AI, or Not To Gen-AI】(MCM/ICM)思路解析及代码分享

摘要:本文研究生成式人工智能(Gen-AI)对三类职业(STEM、技能型工艺、艺术)的影响,建立量化模型预测未来10-20年岗位需求变化。通过分析AI替代效应($R_{sub}(t)$)和增强效应($R_{enh}(t)$),提出差异化高校课程调整策略:STEM专业需加强AI集成能力,技能型工艺专业应结合智能工具与实操训练,艺术专业需平衡AI创作辅助与原创性培养。模型表明,高校通过针对性课程优化可提升毕业生在AI时代的就业竞争力,为教育决策提供数据支持。(149字)

一键难忘的博客 637

springboot动态多数据源配置多线程切换问题

一开始这个动态切换数据源的功能也是借鉴了网上的思路,其中是否存在的问题也并未深究,要拓展spring的功能的时候,还是需要去理解一下spring的设计思想的,纸上得来终觉浅,绝知此事要躬行。

happy_windman的博客 2215

【华为OD技术面试真题 - 技术面】- 测试面试题(1)

专栏:华为OD面试真题精选 目录: 2024华为OD面试手撕代码真题目录以及八股文真题目录黑盒测试:白盒测试:基本功能验证:边界条件测试:空白输入测试:特殊字符和格式测试:响应时间测试:压力测试:针对在不同系统和设备上测试聊天窗口功能,以及网络正常的前置条件,我们可以增加以下测试用例:系统和设备:PC端测试:移动端测试:功能验证:前置条件:网络性能影响测试:Postman:SoapUI:JMeter:Rest-Assured:Tricentis Tosca:ReadyAPI:CI/CD工具集成:测试管理工

算法大师! 3690

SpringBoot+Aop+注解方式 实现多数据源动态切换

SpringBoot+Aop+注解方式 实现多数据源动态切换

Leo_Hth的博客 2127

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

springboot中mybatis多数据源动态切换实现

在开发中,动态数据源配置还是用的比较多的,比如在多数据源使用方面,又或者是在多个DB之间切换方面。这里给出一个动态数据源的配置方案,两个DB均以mysql为例。 多数据源配置引入 mybatis和mysql在springboot中的引入这里就不在说了,不了解的可以参见springboot中mysql与mybatis的引入。 数据源配置如下: datasource: master: t...

相逢一笑 4838

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

SpringBoot+aop实现多数据源动态切换

SpringBoot+aop实现多数据源动态切换 一、多数据源动态切换原理 项目中我们经常会遇到多数据源的问题,尤其是数据同步或定时任务等项目更是如此;又例如:读写分离数据库配置的系统。 1、多数据源设置: 1)静态数据源切换: 一般情况下,我们可以配置多个数据源,然后为每个数据源写一套对应的sessionFactory和dao层代码(以hibernate为例,...

青衫烟雨客的专栏 1万+

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Spring Boot 如何动态切换多数据源?

大约在19年的这个时候,老同事公司在做医疗系统,需要和HIS系统对接一些信息,比如患者、医护、医嘱、科室等信息。但是起初并不知道如何与HIS无缝对接,于是向我取经。最终经过讨论采用了视图对接的方式,大致就是HIS系统提供视图,他们进行对接。写这篇文章的目的这篇文章将会涉及到Spring Boot 与Mybatis、数据库整合什么是多数据源?最常见的单一应用中最多涉及到一个...

程序猿DD 3870

springboot 配置多数据源以及动态切换数据源

配置多数据源有什么用,怎么配置,手动配置实现,注解方式实现 ,引入依赖方式实现

Leaf吧的博客 1641

SpringBoot 配置多数据源并动态切换

SpringBoot 配置多数据源并动态切换 1.实现思路 DataSource是和线程绑定的,动态数据源的配置主要是通过继承AbstractRoutingDataSource类实现的,实现在AbstractRoutingDataSource类中的 protected Object determineCurrentLookupKey()方法来获取数据源,所以我们需要先创建一个多线程线程数据隔离的类来存放DataSource,然后在determineCurrentLookupKey()方法中通过这个类获取当前

weixin_43650943的博客 8698

Spring Boot多数据源配置并通过注解实现动态切换数据源

Spring Boot提供了AbstractRoutingDataSource 根据用户定义的规则选择使用的数据源,这样我们可以在每次数据库操作前设置使用的数据源,实现可动态路由的数据源,从而实现读写分离的功能。

huangjhai的博客 6578

SpringBoot集成ShardingJDBC系列【4】—— 集成多数据源动态切换

文章只负责讲解sharding的相关配置,springboot其他的配置自己解决!! 文章内容将分开发布,便于平时查阅。 集成多数据源动态切换 为什么有了sharding还要配置多数据源? 根据之前SpringBoot集成ShardingJDBC系列【2】—— 基于yaml基本配置这篇文章中提到过这个问题,对于只有部分数据库分库分表,为什么需要将不分库分表的表也配置在分片规则中。 因为ShardingSphere是将多个数据源合并为一个统一的逻辑数据源。因此即使不分库分表的部分,不配置分片规则Sh.

Klayt的博客 6315

SpringBoot多数据源动态切换方案:AbstractRoutingDataSource详解

在现代企业级应用开发中,一个应用系统可能需要同时访问多个数据源,例如主从数据库架构、多租户系统等。Spring Boot 作为一个快速开发框架,提供了便捷的方式来处理多数据源问题。其中,`AbstractRoutingDataSource` 是 Spring 框架中用于动态切换数据源的核心类。本文将详细介绍如何使用 `AbstractRoutingDataSource` 实现 Spring Boot 多数据源动态切换方案。

梵心白莲的博客 1117

SpringBoot多数据源动态切换

        本文环境是SpringBoot + Spring + Mybatis Plus       思路 :               1.配置多数据源               2.使用注解来标记目标数据源               3.使用AOP来动态切换数据源        1.yml: application.yml #app server: port...

欢迎来到wise哲的博客空间 893

SpringBoot:基于SpringBoot实现多数据源动态切换

超详细SpringBoot实现多数据源动态切换

永远保持随时离开的技术能力! 810

SpringBoot实现多数据源,动态数据源自由切换

SpringBoot实现多数据源,动态数据源自由切换 业务场景 在开发中,可能涉及到在用户的业务中要去查询对应订单的数据,而用户和订单又是分处于不同的数据库的,这样的业务该怎么处理呢? 这种就是多数据源的场景,随着业务量的增大,其实这种情况还是经常能遇到的,比如多个数据库分属于不同的服务器,同一个服务器的不同数据库等。 实现原理 正常情况下,我们操作数据是通过配置一个DataSource数据源来连接数据库,然后绑定给SqlSessionFactory,然后通过Dao或Mapper指定SqlSessionFa

执笔编写人生 2508
上一篇: SpringBoot整合Vue
下一篇: SpringCloud之Gateway实现路由转发
Hpsyche
博客等级 码龄9年 1050粉丝 69原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值