当前位置:首页 > 科技  > 软件

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

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

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

1、配置方式

首先是pom.xmlsHU28资讯网——每日最新资讯28at.com

<dependency>        <groupId>com.baomidou</groupId>        <artifactId>dynamic-datasource-spring-boot-starter</artifactId>        <version>3.4.1</version></dependency>

随后配上多数据源,我们的项目中分别配置了Mysql和Doris两种数据库sHU28资讯网——每日最新资讯28at.com

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(“数据库名”),那么整个类下的所有方法都会使用到这个数据源,实现方式是不是非常简单。sHU28资讯网——每日最新资讯28at.com

@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
sHU28资讯网——每日最新资讯28at.com

sHU28资讯网——每日最新资讯28at.com

sHU28资讯网——每日最新资讯28at.com

项目在初始化的时候会调用DynamicRoutingDataSource里面的public synchronized void addDataSource(String ds, DataSource dataSource)方法加载数据源,数据源存进dataSourceMap中。sHU28资讯网——每日最新资讯28at.com

sHU28资讯网——每日最新资讯28at.com

随后,如果进行数据库操作,以方法为最小粒度,执行对应方法时,会被
DynamicDataSourceAnnotationInterceptor拦截器拦截
sHU28资讯网——每日最新资讯28at.com

sHU28资讯网——每日最新资讯28at.com

执行determineDatasource方法,扫描加了@DS注解的类或者方法,随后调用DynamicDataSourceContextHolder.poll方法。sHU28资讯网——每日最新资讯28at.com

sHU28资讯网——每日最新资讯28at.com

DynamicDataSourceContextHolder.poll方法将当前线程的数据源名加到对应的ThreadLocal线程本地中sHU28资讯网——每日最新资讯28at.com

sHU28资讯网——每日最新资讯28at.com

在之后的数据操作中,会调用org.springframework.jdbc.datasource.getConnection()方法,ThreadLocal中获取之前拦截器存进去动态数据源名,如果没有获取到,就默认为配置的primary数据源,这完成了对应的动态数据源切换。sHU28资讯网——每日最新资讯28at.com

sHU28资讯网——每日最新资讯28at.com

3、总结

基于Mybatis-plus的@DS注解可以实现动态数据源切换,具有实现简单的优点,虽然没有AOP实现,但是用到了AOP的思想,后续小编将写一篇基于AOP的实现方式,欢迎大家关注。sHU28资讯网——每日最新资讯28at.com

作者:京东保险 郭盼sHU28资讯网——每日最新资讯28at.com

来源:京东云开发者社区 转载请注明来源sHU28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-16034-0.html多数据源管理:掌握@DS注解的威力

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 使用Python类型提示,保持代码整洁,提高可读性

下一篇: 使用Java实现每分钟限流100个请求的功能

标签:
  • 热门焦点
  • JVM优化:实战OutOfMemoryError异常

    一、Java堆溢出堆内存中主要存放对象、数组等,只要不断地创建这些对象,并且保证 GC Roots 到对象之间有可达路径来避免垃 圾收集回收机制清除这些对象,当这些对象所占空间超过
  • 2天涨粉255万,又一赛道在抖音爆火

    来源:运营研究社作者 | 张知白编辑 | 杨佩汶设计 | 晏谈梦洁这个暑期,旅游赛道彻底火了:有的「地方」火了&mdash;&mdash;贵州村超旅游收入 1 个月超过 12 亿;有的「博主」火了&m
  • 腾讯VS网易,最卷游戏暑期档,谁能笑到最后?

    作者:无锈钵来源:财经无忌7月16日晚,上海1862时尚艺术中心。伴随着幻象的精准命中,硕大的荧幕之上,比分被定格在了14:12,被寄予厚望的EDG战队以绝对的优势战胜了BLG战队,拿下了总决
  • 大厂卷向扁平化

    来源:新熵作者丨南枝 编辑丨月见大厂职级不香了。俗话说,兵无常势,水无常形,互联网企业调整职级体系并不稀奇。7月13日,淘宝天猫集团启动了近年来最大的人力制度改革,目前已形成一
  • 小米MIX Fold 3下月亮相:今年唯一无短板的全能折叠屏

    这段时间以来,包括三星、一加、荣耀等等有不少品牌旗下的最新折叠屏旗舰都有新的进展,其中荣耀、三星都已陆续发布了最新的折叠屏旗舰,尤其号荣耀Magi
  • AI芯片初创公司Tenstorrent获三星和现代1亿美元投资

    Tenstorrent是一家由芯片行业资深人士Jim Keller领导的加拿大初创公司,专注于开发人工智能芯片,该公司周三表示,已经从现代汽车集团和三星投资基金等
  • 苹果公司要求三星和LG Display生产「无边框」OLED iPhone显示屏

    据 The Elec 报道,苹果已要求其供应商为未来的 iPhone 型号开发「无边框」OLED 显示面板。苹果显然已要求三星和 LG Display 开发新的 OLED 显示面
  • 朋友圈可以修改可见范围了 苹果用户可率先体验

    近日,iOS用户迎来微信8.0.27正式版更新,除了可更换二维码背景外,还新增了多项实用功能。在新版微信中,朋友圈终于可以修改可见范围,简单来说就是已发布的朋友圈
  • SN570 NVMe SSD固态硬盘 价格与性能兼具

    SN570 NVMe SSD固态硬盘是西部数据发布的最新一代WD Blue系列的固态硬盘,不仅闪存技术更为精进,性能也得到了进一步的跃升。WD Blue SN570 NVMe SSD的包装外
Top