• 多数据源管理:掌握@DS注解的威力


    大家在日常后端开发过程,不可避免的会接触到需要用到配置多个数据源的场景,在这里,小编介绍一种简单方便的,只需要简单的配置和一个@DS注解就能实现动态数据源的方式,这种动态数据源底层原理是基于Mybatis-plus来实现的。

    1、配置方式

    首先是pom.xml

    <dependency>    
        <groupId>com.baomidougroupId>    
        <artifactId>dynamic-datasource-spring-boot-starterartifactId>    
        <version>3.4.1version>
    dependency>
    

    随后配上多数据源,我们的项目中分别配置了Mysql和Doris两种数据库

    spring:  
        datasource:    
            druid:      
                localdb:        
                    url: xxx        
                    username: xxx     
                    driver-class-name: com.mysql.jdbc.Driver        
                    type: com.alibaba.druid.pool.DruidDataSource      
                doris:       
                    url: xxx        
                    username: xxx
                    driver-class-name: com.mysql.jdbc.Driver        
                    type: com.alibaba.druid.pool.DruidDataSource
    

    最后需要使用哪个数据库,在对应的方法上加上对应的@DS(“数据库名”)注解就可以了,在类上加@DS(“数据库名”),那么整个类下的所有方法都会使用到这个数据源,实现方式是不是非常简单。

    @Service
    @DS("localdb")
    public class testServiceImpl extends BaseServiceImpl implements testService {
    
        public void save(String arg1) {
           //TODO
        }
        
        public void find(String arg2) {
           //TODO
        }
    }
    
    
    

    1、底层实现原理

    底层实现核心类是com.baomidou.dynamic.datasource.DynamicRoutingDataSource,继承自AbstractDataSource

    项目在初始化的时候会调用DynamicRoutingDataSource里面的public synchronized void addDataSource(String ds, DataSource dataSource)方法加载数据源,数据源存进dataSourceMap中。

    随后,如果进行数据库操作,以方法为最小粒度,执行对应方法时,会被 DynamicDataSourceAnnotationInterceptor拦截器拦截

    执行determineDatasource方法,扫描加了@DS注解的类或者方法,随后调用DynamicDataSourceContextHolder.poll方法。

    DynamicDataSourceContextHolder.poll方法将当前线程的数据源名加到对应的ThreadLocal线程本地中

    在之后的数据操作中,会调用org.springframework.jdbc.datasource.getConnection()方法,ThreadLocal中获取之前拦截器存进去动态数据源名,如果没有获取到,就默认为配置的primary数据源,这完成了对应的动态数据源切换。

    3、总结

    基于Mybatis-plus的@DS注解可以实现动态数据源切换,具有实现简单的优点,虽然没有AOP实现,但是用到了AOP的思想,后续小编将写一篇基于AOP的实现方式,欢迎大家关注。

    作者:京东保险 郭盼

    来源:京东云开发者社区 转载请注明来源

  • 相关阅读:
    构建健壮的Spring MVC应用:JSON响应与异常处理
    阿里互联网一线大厂 Java 岗面试题库(2022 年版)
    数据挖掘算法原理与实践:数据预处理
    手把手推导分布式矩阵乘的最优并行策略
    【数据仓库设计基础(三)】数据集市
    特征工程-主成分分析PCA
    LTSPICE使用教程:参数变量和参数扫描
    UnityHub无法打开项目问题,打开项目闪退回到hub界面
    git cherry-pick 合并某次提交
    【社媒营销】WhatsApp Business API:您需要知道的一切
  • 原文地址:https://www.cnblogs.com/Jcloud/p/17745539.html