【SpringBoot】SpringBoot下多数据源的实现,利用AbstractRoutingDataSource抽象类

SpringBoot集成AbstractRoutingDataSource实现动态切换多数据源 spring-jdbc模块提供了AbstractRoutingDataSource抽象类,其内部可以包含多个DataSource,只需要实现其抽象方法,在运行时就可以动态访问指定的数据库。 阅读详情

1.pom依赖

<!-- 阿里数据库连接池 -->
<dependency>
   <groupId>com.alibaba</groupId>
   <artifactId>druid-spring-boot-starter</artifactId>
   <version>1.1.14</version>
</dependency>

<!-- Mybatis-Plus依赖 -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.3.0</version>
</dependency>

<!-- 切面编程 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
    <version>2.1.1.RELEASE</version>
</dependency>

2.使用步骤

1.首先,我们在配置文件中加入配置

# 数据源配置
spring:
    datasource:
        type: com.alibaba.druid.pool.DruidDataSource
        driverClassName: com.mysql.cj.jdbc.Driver
        druid:
            # 主库数据源
            master:
                url: jdbc:mysql://ip:3306/table1?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true
                username: root
                password: root
            # 从库数据源
            slave:
                # 从数据源开关/默认关闭
                enabled: true
                url: jdbc:mysql://ip:3306/table2?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true
                username: root
                password: root
            # 初始连接数
            initialSize: 5
            # 最小连接池数量
            minIdle: 10
            # 最大连接池数量
            maxActive: 20
            # 配置获取连接等待超时的时间
            maxWait: 60000
            # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
            timeBetweenEvictionRunsMillis: 60000
            # 配置一个连接在池中最小生存的时间,单位是毫秒
            minEvictableIdleTimeMillis: 300000
            # 配置一个连接在池中最大生存的时间,单位是毫秒
            maxEvictableIdleTimeMillis: 900000
            # 配置检测连接是否有效
            validationQuery: SELECT 1 FROM DUAL
            testWhileIdle: true
            testOnBorrow: false
            testOnReturn: false
            webStatFilter: 
                enabled: true
            statViewServlet:
                enabled: true
                # 设置白名单,不填则允许所有访问
                allow:
                url-pattern: /druid/*
                # 控制台管理用户名和密码
                login-username: 
                login-password: 
            filter:
                stat:
                    enabled: true
                    # 慢SQL记录
                    log-slow-sql: true
                    slow-sql-millis: 1000
                    merge-sql: true
                wall:
                    config:
                        multi-statement-allow: true

这里如果使用的是两种不同的数据库可以直接把driverClassName放在数据源的信息里面就行了。
2.对Druid的属性写一个配置类

@Configuration
public class DruidProperties
{
    @Value("${spring.datasource.druid.initialSize}")
    private int initialSize;

    @Value("${spring.datasource.druid.minIdle}")
    private int minIdle;

    @Value("${spring.datasource.druid.maxActive}")
    private int maxActive;

    @Value("${spring.datasource.druid.maxWait}")
    private int maxWait;

    @Value("${spring.datasource.druid.timeBetweenEvictionRunsMillis}")
    private int timeBetweenEvictionRunsMillis;

    @Value("${spring.datasource.druid.minEvictableIdleTimeMillis}")
    private int minEvictableIdleTimeMillis;

    @Value("${spring.datasource.druid.maxEvictableIdleTimeMillis}")
    private int maxEvictableIdleTimeMillis;

    @Value("${spring.datasource.druid.validationQuery}")
    private String validationQuery;

    @Value("${spring.datasource.druid.testWhileIdle}")
    private boolean testWhileIdle;

    @Value("${spring.datasource.druid.testOnBorrow}")
    private boolean testOnBorrow;

    @Value("${spring.datasource.druid.testOnReturn}")
    private boolean testOnReturn;

    public DruidDataSource dataSource(DruidDataSource datasource)
    {
        /** 配置初始化大小、最小、最大 */
        datasource.setInitialSize(initialSize);
        datasource.setMaxActive(maxActive);
        datasource.setMinIdle(minIdle);

        /** 配置获取连接等待超时的时间 */
        datasource.setMaxWait(maxWait);

        /** 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 */
        datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);

        /** 配置一个连接在池中最小、最大生存的时间,单位是毫秒 */
        datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
        datasource.setMaxEvictableIdleTimeMillis(maxEvictableIdleTimeMillis);

        /**
         * 用来检测连接是否有效的sql,要求是一个查询语句,常用select 'x'。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会起作用。
         */
        datasource.setValidationQuery(validationQuery);
        /** 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。 */
        datasource.setTestWhileIdle(testWhileIdle);
        /** 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 */
        datasource.setTestOnBorrow(testOnBorrow);
        /** 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 */
        datasource.setTestOnReturn(testOnReturn);
        return datasource;
    }
}

3.利用ThreadLocal特性写一个获取数据源键的工具类

public class DynamicDataSourceUtils
{
    public static final Logger log = LoggerFactory.getLogger(DynamicDataSourceUtils.class);

    /**
     * 使用ThreadLocal维护变量,ThreadLocal为每个使用该变量的线程提供独立的变量副本,
     *  所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。
     */
    private static final ThreadLocal<String> CONTEXT_HOLDER = new ThreadLocal<>();

    /**
     * 设置数据源的变量
     */
    public static void setDataSourceType(String dsType)
    {
        log.info("切换到{}数据源", dsType);
        CONTEXT_HOLDER.set(dsType);
    }

    /**
     * 获得数据源的变量
     */
    public static String getDataSourceType()
    {
        return CONTEXT_HOLDER.get();
    }

    /**
     * 清空数据源变量
     */
    public static void clearDataSourceType()
    {
        CONTEXT_HOLDER.remove();
    }
}```
4.接下来是一个核心步骤,利用AbstractRoutingDataSource类写出数据源切换的逻辑

```java
public class DynamicDataSource extends AbstractRoutingDataSource
{
    public DynamicDataSource(DataSource defaultTargetDataSource, Map<Object, Object> targetDataSources)
    {
    	//设置默认数据源,当不设置数据源时,默认使用该数据源
        super.setDefaultTargetDataSource(defaultTargetDataSource);
        //所有数据源的键值,以Map形式保存
        super.setTargetDataSources(targetDataSources);
        super.afterPropertiesSet();
    }

    @Override
    protected Object determineCurrentLookupKey()
    {
    	//调用数据库连接时会使用该方法,目的是为了取出之前存入Map中的Key,用来获取数据库的连接。
        return DynamicDataSourceContextHolder.getDataSourceType();
    }
}

5.然后我们开始往spring容器中注入Bean
加一个Key的枚举

public enum DataSourceType
{
    /**
     * 主库
     */
    MASTER,

    /**
     * 从库
     */
    SLAVE
}

注入Bean

@Configuration
public class DruidConfig
{
    @Bean
    @ConfigurationProperties("spring.datasource.druid.master")
    public DataSource masterDataSource(DruidProperties druidProperties)
    {
        DruidDataSource dataSource = DruidDataSourceBuilder.create().build();
        return druidProperties.dataSource(dataSource);
    }

    @Bean
    @ConfigurationProperties("spring.datasource.druid.slave")
    @ConditionalOnProperty(prefix = "spring.datasource.druid.slave", name = "enabled", havingValue = "true")
    public DataSource slaveDataSource(DruidProperties druidProperties)
    {
        DruidDataSource dataSource = DruidDataSourceBuilder.create().build();
        return druidProperties.dataSource(dataSource);
    }

    @Bean(name = "dynamicDataSource")
    @Primary
    public DynamicDataSource dataSource(DataSource masterDataSource)
    {
        Map<Object, Object> targetDataSources = new HashMap<>();
        targetDataSources.put(DataSourceType.MASTER.name(), masterDataSource);
        setDataSource(targetDataSources, DataSourceType.SLAVE.name(), "slaveDataSource");
        return new DynamicDataSource(masterDataSource, targetDataSources);
    }

 /**
     * 设置数据源
     * 
     * @param targetDataSources 备选数据源集合
     * @param sourceName 数据源名称
     * @param beanName bean名称
     */
    public void setDataSource(Map<Object, Object> targetDataSources, String sourceName, String beanName)
    {
        try
        {
            DataSource dataSource = SpringUtils.getBean(beanName);
            targetDataSources.put(sourceName, dataSource);
        }
        catch (Exception e)
        {
        }
    }

6.这里,我们已经可以使用了,使用ThreadLocal的方法进行数据源的配置

@Autowired
private BaseMapper baseMapper;

public void getData(){

	DynamicDataSourceUtils.setDataSourceType(DataSourceType.SLAVE.name());
	baseMapper.getList();
	DynamicDataSourceUtils.clearDataSourceType();

}

这里就会发现取出的值已经是从数据源的值了。
7.为了方便使用,我们这里可以使用AOP对方法进行一些封装。
定义一个注解

@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface DataSource
{
    /**
     * 切换数据源名称
     */
    public DataSourceType value() default DataSourceType.MASTER;
}

使用AOP获取该注解的值,动态插入键,使用完成后删除键

@Aspect
@Order(1)
@Component
public class DataSourceAspect
{
    protected Logger logger = LoggerFactory.getLogger(getClass());

    @Pointcut("@annotation(com.ruoyi.common.annotation.DataSource)"
            + "|| @within(com.ruoyi.common.annotation.DataSource)")
    public void dsPointCut()
    {

    }

    @Around("dsPointCut()")
    public Object around(ProceedingJoinPoint point) throws Throwable
    {
        DataSource dataSource = getDataSource(point);

        if (StringUtils.isNotNull(dataSource))
        {
            DynamicDataSourceContextHolder.setDataSourceType(dataSource.value().name());
        }

        try
        {
            return point.proceed();
        }
        finally
        {
            // 销毁数据源 在执行方法之后
            DynamicDataSourceContextHolder.clearDataSourceType();
        }
    }

    /**
     * 获取需要切换的数据源
     */
    public DataSource getDataSource(ProceedingJoinPoint point)
    {
        MethodSignature signature = (MethodSignature) point.getSignature();
        DataSource dataSource = AnnotationUtils.findAnnotation(signature.getMethod(), DataSource.class);
        if (Objects.nonNull(dataSource))
        {
            return dataSource;
        }

        return AnnotationUtils.findAnnotation(signature.getDeclaringType(), DataSource.class);
    }
}

8.后面使用的时候可以直接在方法上添加注解就能实现数据源的切换了

    @GetMapping
    @DataSource(value = DataSourceType.SLAVE)
    public ResponseData profile()
    {
        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
        SysUser user = loginUser.getUser();
        ResponseData ajax = ResponseData.success(user);
        ajax.put("roleGroup", userService.selectUserRoleGroup(loginUser.getUsername()));
        ajax.put("postGroup", userService.selectUserPostGroup(loginUser.getUsername()));
        return ajax;
    }

3.原理讲解

SpringBoot在进行数据库的操作时,会从DataSource类下获取数据库的连接
在这里插入图片描述
这里的AbstractRoutingDataSource继承了DataSource的getConnection方法,在获取数据源之前定义了一些逻辑
在这里插入图片描述
在这里插入图片描述
在这里,我们就可以看到,在获取数据源之前,先从determineCurrentLookupKey方法中获取了Key,从我们之前传入的Map中获取对应的值。

Spring Boot主从数据库完全教程 - 从零到精通 SpringBoot主从分离实践指南 摘要 本文详细介绍了如何在SpringBoot项目中实现MySQL主从数据库分离,提升系统性能和数据安全。主要内容包括: 主从数据库基础:解释主从数据库架构、复制原理及其优势 环境搭建:配置MySQL主从环境并进行同步测试 项目初始化:创建SpringBoot项目,配置数据源和连接池 核心实现:通过动态数据源和注解实现读写分离 高级特性:包括自动路由、多从库负载均衡和事务处理 监控运维:配置Druid监控、主从状态检查和性能优化 实战案例:用户管理和订单系统实现示例 学 阅读详情

相关推荐

springboot之AbstractRoutingDataSource抽象类实现动态多数据源切换原理解析

之前写过两篇实现动态多数据源的文章: 第一种:半自动化模式https://blog.youkuaiyun.com/yaomingyang/article/details/100807675 第二种:完全自动化配置模式:https://blog.youkuaiyun.com/yaomingyang/article/details/117089979 但是一直未对其实现的核心抽象类AbstractRoutingDataSource进行讲解,今天我们就来看下这个抽象类的源码实现原理;先看下部分源码: /** * Abstract {@

OceanSky的专栏 7260

springboot配置多数据源(又名主从库的配置)

缘由 单个库已无法满足需求,并且要求在代码中动态更改数据来源。 代码运行时根据各自方法或类中的不同标识来自动判断使用哪个库获取数据。 比如人员数据在a库获取、业绩数据在b库获取。 步骤 1.springboot集成mysql驱动、mybatis以及druid连接池 2.填写多个库的配置数据,分别配置对应的数据源以及一个动态数据源。 3.继承AbstractRoutingDataSource(每次访问mysql均会由它获取数据源),覆写获取数据源的方法。 4.自定义一个注解,标记那些需要切换数据源的方法或类。

缔曦的博客 1988

SpringBoot整合多数据源

我们在调用任何持久层的框架,都是基于JDBC进行操作的,只要集成了Spring框架就一定会注入配置的DataSource获取连接。既然是我们配置的,我们可以实现一个自定义的DataSource,然后动态提供数据源。说干就干那我们实现DataSource这个接口,实现方法即可,会返回一个Connection对象。我们在这个方法中根据业务需求动态提供不同数据源的Connection对象即可。实现逻辑如下:我们可以通过一个静态的标识去判断,比如如果是Write,那就返回,如果是Read,就返回。

冲出仁川,走出马德里,故事还会再继续 1741

Spring Boot学习笔记(十一)Druid数据源及动态数据源配置

druid数据源及动态数据源配置

飞!!!的博客 5004

企业和个人 AI 编程工具怎么选?2025 年 12 款主流工具(Claude/Cursor 等)核心能力 + 收费对比

2025 年最火的 12 款 AI 编程工具,像 Claude、Cursor 这些热门款,我把它们的核心能力、收费标准全扒得明明白白,看完这篇你不用再瞎琢磨,直接就能挑到对的!再说说 Cursor,美国 Cursor Labs 做的,还拿过红杉资本投资,2022 年推出后,2024 年收入直接涨了 6400%,势头很猛。总之,不管你是企业技术管理者、程序员,还是刚入门的 AI 小白,按自己的需求(语言、合规、预算)挑,保准能找到最适合的 AI 编程工具!最后给大家划重点,不同需求直接对号入座:?

hundred98的博客 2800

STM32控制舵机SG-5010转动,HAL库

首先设置时钟为72Mhz,预分频系数为72-1,自动重装载计数器的值为5000-1,这样的话就可以得到一个5ms的脉冲宽度,5000的计数值可以让舵机的旋转角度变得更加易控且相对精准,计算旋转角度的时候也可以更加精确。所以我们5ms脉宽,period是5000脉宽-------------角度----------pulse0.5ms-------------0度----------500;1.0ms------------45度---------1000;

qq_73783264的博客 1291

使用 Spring Boot + AbstractRoutingDataSource 实现动态切换数据源

功能说明数据源上下文管理工具支持嵌套切换线程隔离AOP + 注解实现优雅的数据源切换推荐使用的封装库。

lzping_719的专栏 1049

芯片缺陷检测全流程:从光学成像到AI自动判别的实战路线

在半导体制造中,良率是衡量产线效率的核心指标,而缺陷检测则是守住良率的关键防线。传统人工显微镜目检已难以应对微米级乃至纳米级缺陷的挑战,工业界正加速转向机器视觉与深度学习相结合的技术方案。其核心原理在于:先通过明场、暗场或DIC等光学成像获取高对比度图像,再借助传统图像处理算法快速提取候选缺陷区域,最后利用CNN等深度学习模型对缺陷进行精准分类与判定。这一技术路线不仅大幅提升检测效率与准确性,还能有效降低漏检和误报,广泛应用于晶圆制造、封装测试等环节。本文从成像选型、算法分工、数据标注到模型部署,系统梳理了

weixin_29053577的博客 263

springboot 实现多数据源的底层原理

多数据源

一天不写代码难受的博客 1025

eNSP无法启动AR报错码40,而且按照eNSP帮助手册排查都没用,我的处理方法【自己存档版】

eNSP无法启动AR报错码40,而且按照eNSP帮助手册排查都没用,我的处理方法【自己存档版】

mizhiakk的博客 8404

从零构建企业级多智能体系统:LangGraph 全流程实战 + 部署指南(含代码与架构图)

> 在大模型应用爆发的今天,如何构建一个可协作、可调试、可部署的多智能体系统?LangGraph 正在成为工程师的新宠。本文从原理剖析、流程建模、代码实战到前后端部署,手把手带你用 LangGraph 构建一个企业级 AI 助理系统,整合财务分析、法务审阅、报告生成与图表可视化等 Agent 模块,全面打通从用户输入到报告输出的全链路闭环。适合有工程思维的 AI 架构师、Agent 研发人员、以及大模型项目实践者。

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 3449

springboot+mybatis配置多数据源(分包策略和AOP策略)

简介: 随着并发量的不断增加,显然单个数据库已经承受不了高并发带来的压力。一个项目使用多个数据库(无论是主从复制- - 读写分离还是分布式数据库结构)的重要性变得越来越明显。传统项目中(个人对传统项目的理解就是所有的业务模块都在一个tomcat中完成,多个相同的tomcat集群也可认为是传统项目)整合多数据源有两种方法:分包和AOP。 版本: springboot:1.5.9.RELEASE ...

菜园子丶For丨丶Tomorrow的博客 1858

【OpenClaw从入门到精通】零基础入门——OpenClaw核心概念快速理解(2026入门版)

OpenClaw是一个强大的AI代理框架,旨在构建智能化的自动化任务处理系统。随着人工智能技术的快速发展,OpenClaw为开发者和企业提供了一个完整的解决方案,用于创建能够理解、学习和执行复杂任务的智能体。本文将带领零基础的读者快速理解OpenClaw的核心概念,从基础架构到实际应用,为后续深入学习奠定坚实基础。通过本文的学习,你将掌握OpenClaw的基本原理、核心组件和快速上手方法。

一键难忘的博客 324

2025-spring boot 之多数据源管理

Component@Primary // 将该Bean设置为主要注入Bean// 当前使用的数据源标识// 写@Autowired// 读@Autowired// 返回当前数据源标识@Override@Override// 为targetDataSources初始化所有数据源// 为defaultTargetDataSource 设置默认的数据源// 保留方式。

myStyle的博客 1017

量化交易之因子分析大全

在机器学习项目中,特征工程是非常重要的。在量化研究中也是如此。本文将量化研究中常用到的特征,也就是因子进行详细收纳,并给出推导公式和实现代码。

夏之微风的博客 2282

智能车图像处理11-进阶篇3--中线累积差值的统计

中线累积差值的统计在后面判断小S,以及长直道的时候都有用到,关键点在于中线的跳变 第12 - 13 行:comulants1 和comlants2代表的是两种不同的累差,取的行数不同 第14-17 行:comulants2取6到25行,其实就是My_Abs(LCenter[i], LCenter[i - 1])的累加 第18-21 行:comulants1去第1到40行 第27- 行: 计算了一下右线的开始于最终结束行,这里判断R_black是否为0,是和中线的提取中g

taiyuezyh的博客 3824

【SpringBoot】实现Mybatis+Druid的多数据源切换和动态数据源加载

1. **多DataSource + 多SqlSessionFactory** 在使用Dao层的时候通过不同的SessionFactory进行处理,一般的情况下我们都是使用Mybatis,配置多个DataSource,每个DataSource扫描不同的Mapper、注入到不同SqlSessionFactory实现的多数据源。 2. **使用AbstractRoutingDataSource的实现类通过AOP或者手动处理实现动态的使用我们的数据源**, 基于这种方式,不仅可是实现真正意义上的`多数据源的

墩墩分墩 1997

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

【AOP】SpringBoot 配置 Druid多数据源 通过 注解 + AOP 实现线程多数据源切换 AbstractRoutingDataSource多数据源实现 多类型数据库配置

SpringBoot 配置 Druid多数据源 注解 + AOP 实现线程多数据源切换 AbstractRoutingDataSource多数据源实现 多类型数据库配置 项目配置多个数据库

肥宅友的博客 2419

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

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

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

Spring Boot 动态数据源

AbstractRoutingDataSource是Spring2.0.1版本引入的一个抽象类,它提供了多数据源的支持能力。AbstractRoutingDataSource抽象类定义了抽象的determineCurrentLookupKey方法,子类只需实现此方法,进而动态确定要使用的数据源。

web13116256725的博客 628

spring boot使用AbstractRoutingDataSource实现动态数据源切换

一、AbstractRoutingDataSource Spring boot提供了AbstractRoutingDataSource 根据用户定义的规则选择当前的数据源,这样我们可以在执行查询之前,设置使用的数据源。实现可动态路由的数据源,在每次数据库查询操作前执行。它的抽象方法 determineCurrentLookupKey() 决定使用哪个数据源。 org.springframework...

愿风裁尽尘中沙 7万+

基于AbstractRoutingDataSource实现SpringBoot动态数据源

AbstractRoutingDataSource + ThreadLocal + AOP 实现动态数据源切换

gaole的博客 1751

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

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

梵心白莲的博客 1117

【SpringBoot】多数据源切换

市面上常见的多数据源实现方案如下:方案1:基于Spring框架提供的AbstractRoutingDataSource。优点: 简单易用,支持动态切换数据源;适用于少量数据源情况。场景:适用于需要动态切换数据源,且数据库较少的情况。文档地址:方案2:使用MP提供的Dynamic-datasource多数据源框架。

精益求精 3665

SpringBoot AbstractRoutingDataSource实现动态数据源

一、AbstractRoutingDataSource Spring boot提供了AbstractRoutingDataSource 根据用户定义的规则选择当前的数据源,这样我们可以在执行查询之前,设置使用的数据源。实现可动态路由的数据源,在每次数据库查询操作前执行。它的抽象方法 determineCurrentLookupKey() 决定使用哪个数据源。 org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource 源码的介

weixin_38987366的博客 971

重学SpringBoot3-AbstractRoutingDataSource介绍

在现代的应用开发中,尤其是在 SaaS 多租户架构、读写分离、或者多数据源的场景下,通常需要动态地切换数据源。Spring Boot 3 提供的 `AbstractRoutingDataSource` 类是实现这一功能的核心工具之一。

CoderJia的学习之路 1421

SpringBoot 配置 动态数据源 AbstractRoutingDataSource

SpringBoot 配置 动态数据源 Spring boot提供了AbstractRoutingDataSource 根据用户定义的规则选择当前的数据源,这样我们可以在执行查询之前,设置使用的数据源。实现可动态路由的数据源,在每次数据库查询操作前执行。它的抽象方法 determineCurrentLookupKey() 决定使用哪个数据源。 AbstractRoutingDataSource的getConnection() 方法根据查找 lookup key 键对不同目标数据源的调用,通常是通过(但不一定

JeromeLucky的博客 1430
上一篇: 【Docker】docker管理工具Portainer的使用
下一篇: 【Java进阶】Java线程池ThreadPoolExecutor的使用详解以及SpringBoot下如何使用线程池
JeffHan^_^
博客等级 码龄7年 1万+粉丝 134原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JeffHan^_^

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值