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

打印 上一主题 下一主题

主题 906|帖子 906|积分 2718

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

首先是pom.xml
  1. <dependency>   
  2.     <groupId>com.baomidou</groupId>   
  3.     <artifactId>dynamic-datasource-spring-boot-starter</artifactId>   
  4.     <version>3.4.1</version>
  5. </dependency>
复制代码
随后配上多数据源,我们的项目中分别配置了Mysql和Doris两种数据库
  1. spring:  
  2.     datasource:   
  3.         druid:      
  4.             localdb:        
  5.                 url: xxx        
  6.                 username: xxx     
  7.                 driver-class-name: com.mysql.jdbc.Driver        
  8.                 type: com.alibaba.druid.pool.DruidDataSource      
  9.             doris:      
  10.                 url: xxx        
  11.                 username: xxx
  12.                 driver-class-name: com.mysql.jdbc.Driver        
  13.                 type: com.alibaba.druid.pool.DruidDataSource
复制代码
最后需要使用哪个数据库,在对应的方法上加上对应的@DS(“数据库名”)注解就可以了,在类上加@DS(“数据库名”),那么整个类下的所有方法都会使用到这个数据源,实现方式是不是非常简单。
  1. @Service
  2. @DS("localdb")
  3. public class testServiceImpl extends BaseServiceImpl<testMapper, testBean> implements testService {
  4.     public void save(String arg1) {
  5.        //TODO
  6.     }
  7.    
  8.     public void find(String arg2) {
  9.        //TODO
  10.     }
  11. }
复制代码
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的实现方式,欢迎大家关注。
作者:京东保险 郭盼
来源:京东云开发者社区 转载请注明来源

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

伤心客

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表