写点什么

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

  • 2023-10-07
    北京
  • 本文字数:1201 字

    阅读完需:约 4 分钟

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

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




项目在初始化的时候会调用 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 的实现方式,欢迎大家关注。


作者:京东保险 郭盼

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

发布于: 刚刚阅读数: 6
用户头像

拥抱技术,与开发者携手创造未来! 2018-11-20 加入

我们将持续为人工智能、大数据、云计算、物联网等相关领域的开发者,提供技术干货、行业技术内容、技术落地实践等文章内容。京东云开发者社区官方网站【https://developer.jdcloud.com/】,欢迎大家来玩

评论

发布
暂无评论
多数据源管理:掌握@DS注解的威力 | 京东云技术团队_mybatis_京东科技开发者_InfoQ写作社区