多数据源管理:掌握@DS注解的威力 | 京东云技术团队

京东云开发者
• 阅读 117

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

1、配置方式

首先是pom.xml

<dependency>    
    <groupId>com.baomidou</groupId>    
    <artifactId>dynamic-datasource-spring-boot-starter</artifactId>    
    <version>3.4.1</version>
</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<testMapper, testBean> implements testService {

    public void save(String arg1) {
       //TODO
    }

    public void find(String arg2) {
       //TODO
    }
}

1、底层实现原理

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

多数据源管理:掌握@DS注解的威力 | 京东云技术团队

多数据源管理:掌握@DS注解的威力 | 京东云技术团队

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

多数据源管理:掌握@DS注解的威力 | 京东云技术团队

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

多数据源管理:掌握@DS注解的威力 | 京东云技术团队

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

多数据源管理:掌握@DS注解的威力 | 京东云技术团队

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

多数据源管理:掌握@DS注解的威力 | 京东云技术团队

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

多数据源管理:掌握@DS注解的威力 | 京东云技术团队

3、总结

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

作者:京东保险 郭盼

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

点赞
收藏
评论区
推荐文章
我已经把它摸的透透的了!!!Spring 动态数据源设计实践,全面解析
Spring动态数据源动态数据源是什么?它能解决什么???在实际的开发中,同一个项目中使用多个数据源是很常见的场景。比如,一个读写分离的项目存在主数据源与读数据源。所谓动态数据源,就是通过Spring的一些配置来自动控制某段数据操作逻辑是走哪一个数据源。举个读写分离的例子,项目中引用了两个数据源,master、slave。通过Spring配置或扩展能力来
Chase620 Chase620
3年前
MyBatis 源码分析 - 内置数据源
MyBatis源码分析内置数据源1.简介本篇文章将向大家介绍MyBatis内置数据源的实现逻辑。搞懂这些数据源的实现,可使大家对数据源有更深入的认识。同时在配置这些数据源时,也会更清楚每种属性的意义和用途。因此,如果大家想知其然,也知其所以然。那么接下来就让我们一起去探索MyBatis内置数据源的源码吧。MyBatis支持三种数据源配置,分别
Easter79 Easter79
2年前
Spring环境下JNDI的使用
上一篇记录的使JNDI的简单使用,今天记录的是SpringJNDI的配置。一、配置JNDI的数据源数据源有两种配置方式:1、将数据源配置在tomcat等web容器中(以tomcat为例),这样做的好处就是运行在配置过JNDI数据源的web容器下的项目都可以使用该数据源,也就是说在容器中配置好数据源之后,数据源在该web容器中是共享的。配
Stella981 Stella981
2年前
Spring Boot 集成 Mybatis 实现双数据源
这里用到了SpringBootMybatisDynamicDataSource配置动态双数据源,可以动态切换数据源实现数据库的读写分离。添加依赖加入Mybatis启动器,这里添加了Druid连接池、Oracle数据库驱动为例。<dependency<groupIdorg.mybatis.spring
Stella981 Stella981
2年前
BeetlSQL 3.0.10 发布,多数据源分布式sega事务支持
本次发布主要增加了分布式Sega事务支持,适合多数据源按照社区建议,修改了了springboot的yml配置方式修改了@Jackson和@UpdateTime,本来是用来作为例子,但社区开发者提供了较好的完整实现增加Sega支持<dependency<groupIdcom.ibeetl</gr
Stella981 Stella981
2年前
Spring Boot 2.x基础教程:使用JTA实现多数据源的事务管理
在一个SpringBoot项目中,连接多个数据源还是比较常见的。之前也介绍了如何在几种常用框架的场景下配置多数据源,具体可见:SpringBoot2.x基础教程:JdbcTemplate的多数据源配置(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fblog.didisp
Stella981 Stella981
2年前
Spring boot 多数据源
网上多是基于XML文件,本文使用基于配置类的方式使用动态数据源。多数据源原理Spring作为项目的应用容器,也对多数据源提供了很好的支持,当我们的持久化框架需要数据库连接时,我们需要做到动态的切换数据源,这些Spring的AbstractRoutingDataSource都给我们留了拓展的空间,可以先来看看抽象类AbstractR
Stella981 Stella981
2年前
Spring 注解之@Import 注入的各种花活
今天来分享一下pig4cloud中涉及的@Import的注入形式。通过不同形式的注入方式,最大程度使得架构简洁。@Import导入一个组件来看EnablePigxDynamicRoute这个注解,当我们需要开始动态数据源时,只需要在main方法加上此注解即可。@Target({Elem
Easter79 Easter79
2年前
Spring支持多数据源的@Transactional事务注解
1、配置事务注解驱动、每个数据源对应的事务管理器,并定义“限定符”<tx:annotationdriven/    <bean id"transactionManager1" class"org.springframework.jdbc.DataSourceTransactionManager"  ... 
Stella981 Stella981
2年前
Spring Boot 动态数据源(yml配置,多数据源自动切换)
1、在启动类添加注解,注册动态多数据源:@SpringBootApplication@Import({DynamicDataSourceRegister.class})//注册动态多数据源publicclassOrangeplusApplicationextendsWebMvcConfigurerAdapt