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

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

大家在日常后端开发过程,不可避免的会接触到需要用到配置多个数据源的场景,在这里,小编介绍一种简单方便的,只需要简单的配置和一个@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
    }
}

2、底层实现原理

底层实现核心类是
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的实现方式,欢迎大家关注。

作者:京东保险 郭盼

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

责任编辑:武晓燕 来源: 今日头条
相关推荐

2024-10-30 10:22:17

2020-12-31 07:55:33

spring bootMybatis数据库

2023-09-07 08:39:39

copy属性数据源

2023-11-27 07:33:55

2009-08-14 10:26:27

ibatis多数据源

2020-11-24 09:56:12

数据源读写分离

2023-06-07 08:08:37

MybatisSpringBoot

2020-03-13 14:05:14

SpringBoot+数据源Java

2023-01-04 09:33:31

SpringBootMybatis

2020-06-02 07:55:31

SpringBoot多数据源

2022-05-18 12:04:19

Mybatis数据源Spring

2022-12-19 07:21:35

Hutool-db数据库JDBC

2022-05-10 10:43:35

数据源动态切换Spring

2017-07-21 14:50:15

数据库DB分库事务处理

2023-10-18 15:25:29

数据源数据库

2017-09-04 14:52:51

Tomcat线程数据源

2012-06-17 13:04:45

2022-01-12 17:39:16

Spring多租户数据

2010-12-27 09:59:11

ODBC数据源

2009-06-15 13:24:46

JBoss数据源
点赞
收藏

51CTO技术栈公众号