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

PID循迹控制算法

前言  让小车进行循迹最重要的是获取车相对于循迹线的位置,关于循迹模块的原理我已经在之前的一篇博客上讲过,如果大家没看过的话可以点此链接:PID循迹模块原理。 PID循迹原理简介 图1 循迹车寻线行走图示 图2 市场常见循迹传感器  PID循迹的原理我们大致可以用常识性思维去思考下,如图1所示为循迹车寻线行走图示,现在小车要按照中间那条黑线循迹行走,如果车头往左偏则需要控制方向盘让车往右转,车头往又偏则需要让车往左转。但是仅仅只有左转和右转的话,车一到左边就向右转,一到右边就向左转,则车会来回在线左右晃动

Dinvent的博客 7万+

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

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

weixin_30383279的博客 240

你需要这样一个Ros软路由—— 路由器+外网+一号通ip线路=动态ip的WiFi信号

功能强大 管理便捷—给您全新的路由体验 一键更换指定线路or批量更换所有IP/MAC/SSID 自定义走本地网络策略的分流功能 设备批发价、不限制拨号账号服务商 强大的单设备/多设备IP去重功能 批量导入、管理一号通线路 一键任意切换5G_WiFi(推荐)/2.4G_WiFi(建议不用) 设备支持PPTP/L2TP/SSTP/openVP.N等协议 独家支持openVPN,适用于网络受限用户 支持自行接入AP和交换机扩容 一键打开/关闭所有虚拟WiFi 一键隐藏/显示设备WiFi...

米粒儿 4258

揭秘 | 顶刊论文插图中的高级配色方案(附RGB/HEX码解析)

本文揭秘了顶级期刊如《Nature》《Science》插图的高级配色方案,详细解析了RGB/HEX码的应用技巧。从双色配色的黄金组合到复杂数据可视化的多色解决方案,提供了实用的配色法则和跨平台一致性建议,帮助科研人员提升图表专业度和视觉传达效果。

weixin_28523493的博客 987

SpringBoot配置多数据源

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

qq_43540133的博客 1728

华为灵衢UB总线介绍

华为发布"灵衢"(UB)超节点互联协议,旨在构建支持AI大模型计算的基础设施。该协议采用统一内存语义和对等架构,使设备可直接访问远程内存,实现资源池化。技术突破包括2.1微秒超低时延和TB级带宽,支持64节点、52万张昇腾卡的集群互联。相比传统RDMA,"灵衢"更注重系统级资源调度,而非单纯数据传输。华为开放技术规范,推动生态建设,已有厂商开发兼容IP核。"灵衢"可适应x86、RISC-V等架构,未来将扩展至百万卡规模集群。

技术引领业务创新 4426

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

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

壮乡码农 1万+

基于aarch64分析kernel源码 六:kernel_init进程(1号进程)、kthreadd进程(2号进程)

kernel_init进程(1号进程)、kthreadd进程(2号进程)分析

OnlyLove_的博客 764

学Simulink——十二脉波整流电路(移相变压器)谐波抵消仿真

Y:Δ = 1:√3(若 DC 同压)— 此处同相电压故 220V(Y)=220V(Δ phase)Y(相电压=220V)、Δ(线电压=380V ⇒ 相=220V,30° 移相)可经 Lbal​=0.5mH(平衡电抗)或直接短(大 L_dc 下均流尚可)✅ 直流输出纹波频率 = 12·f_line(vs 6·f_line)直流输出 → Ldc​=50mH→Cdc​=2200µF→R=30Ω。Line‑Line RMS = 380 V(⇒ 相=220V)Vdc​≈1.35⋅380≈513V(同 6‑脉波)

xiaoheshang_123的博客 59

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

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

happy_windman的博客 2215

Python爬虫实战:构建药监局药品批准信息本地查询系统

在医药信息化时代,药品批准信息的快速查询对于医药从业者、研究人员和普通消费者都具有重要意义。国家药品监督管理局(NMPA)提供了官方的药品查询系统,但有时我们需要建立本地数据库以便批量分析或离线查询。本文将详细介绍如何使用Python爬虫技术,结合最新的异步爬虫框架和技术栈,构建一个完整的药监局药品信息本地查询系统。本系统将实现以下功能:自动化爬取药监局官网的药品批准信息数据清洗和结构化存储建立本地查询接口数据定期更新机制pythonimport os"""药品类型枚举"""

2201_76125261的博客 728

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

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

Leo_Hth的博客 2127

Lumerical 教程,包含作者个人理解及相关设计案例 (目前共计184篇,持续更新中)

4138。

u011699626的博客 1625

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

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

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

相逢一笑 4838

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

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

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

青衫烟雨客的专栏 1万+

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

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、付费专栏及课程。

余额充值