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

发表于:2023-11-02 09:38

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:京东保险 郭盼    来源:京东云开发者社区

#
后端
  大家在日常后端开发过程,不可避免的会接触到需要用到配置多个数据源的场景,在这里,小编介绍一种简单方便的,只需要简单的配置和一个@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数据源,这完成了对应的动态数据源切换。
  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号