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

(给ImportNew加星标,提高Java技能)


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

转自:郭盼/京东云开发者社区,

链接:blog.csdn.net/jdcdev_/article/details/133635988



- EOF -

推荐阅读  点击标题可跳转

1、SpringBoot ( 七 ) :springboot + mybatis 多数据源最简解决方案

2、实践 Druid 作为 SpringBoot 工程的数据源添加 SQL 监控

3、SpringBoot 分布式事务的解决方案(JTA+Atomic+多数据源)


看完本文有收获?请转发分享给更多人

关注「ImportNew」,提升Java技能

点赞和在看就是最大的支持❤️

相关推荐

  • 用 AI 写了10万行代码后,我总结了这些好用的经验
  • 没事别碰 GPT-4-32K,太太太太太贵了!
  • 【编制单位招聘前端,后端,软件工程等相关人员】 正式编!六险二金!提供住宿!双休!||附岗位要求
  • 教你写一个Vite插件,分析你的项目打包产物体积,带图表的~
  • 大模型「进化手册」:英伟达这次终于放大招了!
  • SpringCloud 微服务迁移到 Kubernetes 容器化完整流程
  • 不要小看Redis,真的强!!
  • ChatGPT入门指南:一文了解如何获取GPT4账号及AI绘图应用
  • 如何给application.yml文件的敏感信息加密?
  • 浅谈前端出现率高的设计模式
  • 华为全面完成5G-A技术性能测试;苹果将在iOS 18上推出生成式AI功能;Mojo编程语言发布 Mac 版本|极客头条
  • 看这里!!1024个程序员关于AI PC 的联想
  • 面试官:如何判断两个数组的内容是否相等???
  • 强化学习的一周「GitHub 热点速览」
  • 这些过时的前端技术请不要再继续学了!
  • 如何使用 Pinia ORM 管理 Vue 中的状态
  • 知乎热帖:为什么很多人在一家公司工作 2-3 年就会跳槽?
  • 简单有效!Direct Inversion: 三行代码提升基于Diffusion的图像编辑效果
  • 复旦大学自然语言处理实验室:如何构建和训练ChatGPT
  • 提升图神经网络性能方法综述