说起动态数据源,大家应该也不陌生。例如在读写分离系统中,则要对请求中的读写操作进行分离,让读和写落在不同的数据库上;例如在多租户系统中,则要根据请求来源租户的不同,让其落在不同租户的数据库上;例如在分库应用中,也要根据不同的规则让请求落在不同的数据库上。于是,我们的应用要根据请求的不同,操作不同的数据库,这时就需要动态数据源的帮助。

DynamicDataSource就是一个出色的动态数据源,他能让你在程序运行过程中动态增删和切换数据源。而且,它十分易用。使用它在一个请求中查询多个数据源变得无比简单。

1 特点

DynamicDataSource具有以下特点:

  • 小巧:只实现最基本的数据源增删、切换功能,不涉及相关业务。
  • 易用:只需要简单的配置和几个方法的调用便可以完成所有功能。
  • 兼容:增加数据源时,数据源信息可以来自配置文件、前端界面输入、数据库查询等各种方式。
  • 无侵入:切换数据源操作可以由切面触发、逻辑触发、注解触发等,均可以供开发者自由实现。

DynamicDataSource中常用的方法有:

  • boolean addDataSource(DataSourceInfo dataSourceInfo, Boolean overwrite):增加一个数据源,overwrite用来决定如果已经存在同名数据源时是否要覆盖
  • boolean addAndSwitchDataSource(DataSourceInfo dataSourceInfo, Boolean overwrite):增加一个数据源并切换到该数据源,overwrite用来决定如果已经存在同名数据源时是否要覆盖
  • boolean switchDataSource(String dataSourceName):切换到指定名称的数据源
  • boolean delDataSource(String dataSourceName):删除一个数据源
  • void switchDefaultDataSource():切换到默认的数据源
  • DataSource getDefaultDataSource():获取默认数据源

以上方法都是多线程安全的。你可以在切面、操作逻辑、注解中调用以上方法,完成数据源的动态增删与切换。

2 快速上手

demo文件夹下提供一个示例项目,供大家快速上手。以该demo项目为例,我们介绍DynamicDataSource的使用。

2.1 引入依赖包

在POM文件中引入DynamicDataSource的jar包。

2.2 基本配置

在application.properties文件中写入默认的数据源信息,下面为示例。可按照自己的数据源进行修改。

禁止Spring对DataSourceAutoConfiguration类的加载,否则该类会去加载固定的数据源。

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) 

增加对DynamicDataSource所在包的Bean的扫描。

@ComponentScan(basePackages = {"com.github.yeecode.dynamicdatasource","{other_package_root}"}) 

2.3 开始使用

至此,使用DynamicDataSource所需的全部配置就完成了。使用下面方式注入DynamicDataSource后便可以调用其中的数据源操作方法。

@Autowired
private DynamicDataSource dynamicDataSource; 

我们可以按照demosqlDDL.md文件所述建立两个数据源,然后测试DynamicDataSource的工作情况。

启动DynamicDataSourceDemo项目得到如下界面。

例如我们可以在一个接口内实现数据源的切换,从而在请求到达/接口时,先后查询了两个数据源中的数据,如代码所示。

可以得到下图所示的结果。下图打印的两行语句分别来自两个数据源。

数据源新增、删除、切换操作可以在切面中、业务逻辑中、注解中等各处进行触发。DynamicDataSource不做任何限制,交由开发人员按照实际需要实现。

3 总结

怎么样,DynamicDataSource的使用是不是非常简单。通过Maven仓库直接下载依赖,并且还有Demo项目指导,瞬间上手。

从此,动态数据源的切换So Easy!

实属架构师、程序员秘笈,收藏起来,日后用。其具体接口可能在日后升级中变动,请以最新版本的README文档为准。项目地址如下:

https://github.com/yeecode/DynamicDataSource​github.com

2 数据源配置_如何在程序运行中动态切换数据源?架构师必读秘笈相关推荐

  1. springboot 中动态切换数据源(多数据源应用设计)

    目录 原理图 数据库 项目结构 启动类 entity controller service mapper 配置文件 线程上下文 (DataSourceHolder) 动态数据源 DynamicData ...

  2. Spring Boot多数据源配置并通过注解实现动态切换数据源

    文章目录 1. AbstractRoutingDataSource类介绍 2. ThreadLocal类介绍 3. 环境准备 3.1 数据库准备 3.2 项目创建 4. 具体实现 4.1 定义数据源枚 ...

  3. mybatis手动切换数据库_在Spring项目中使用 Mybatis 如何实现动态切换数据源

    在Spring项目中使用 Mybatis 如何实现动态切换数据源 发布时间:2020-11-17 16:20:11 来源:亿速云 阅读:108 作者:Leah 这篇文章将为大家详细讲解有关在Sprin ...

  4. c语言代码存放的区域 堆栈,C语言中内存分布及程序运行中(BSS段、数据段、代码段、堆栈)...

    BSS段:(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域.BSS是英文Block Started by Symbol的简称.BSS段属于静态内存分配. 数据段 :数据 ...

  5. 程序员好几年才能成为架构师_成为更好的企业架构师

    程序员好几年才能成为架构师 企业架构师似乎越来越多地参与"尝试新事物"或推翻技术或实施建议(否定命令),而不必费劲或无需编写任何代码. 我已经在很多地方观察到了这一点,无论是与建筑 ...

  6. 动态切换数据源(spring+hibernate)

    起因:在当前我手上的一个项目中需要多个数据源,并且来自于不同类型的数据库... 因为很多历史原因.这个项目的住数据源是MySQL,整个系统的CURD都是操作的这个数据库. 但是还有另外两个用于数据采集 ...

  7. SpringBoot动态切换数据源-快速集成多数据源的启动器

    简介 dynamic-datasource-spring-boot-starter 是一个基于springboot的快速集成多数据源的启动器. 其支持 Jdk 1.7+, SpringBoot 1.4 ...

  8. 5分钟弄懂程序员的如何升级到架构师。

    对我们程序员来说,发展的途径要么是走管理岗,从开发升级到项目经理甚至是部门经理:要么走技术升级路线.不过在技术路线方面,无法升级到架构师的程序员不在少数.一方面,在不少公司的高级开发岗位上,无法让程序 ...

  9. 通过切面动态切换数据源

    标题业务场景:大量的项目的数据库需要从db2迁移到oracle,为项目上线后出现不可预料的错误可及时回退,需要可以随时切换数据源 以控制层为切点,动态切换数据源,通过查询数据库查询当前应用的开关,来判 ...

最新文章

  1. 学术前沿 | 图像质量量化评估标准综述
  2. NameNode机制和DataNode机制
  3. JBoss Fuse 6.1 + HawtIO第一部分
  4. Android手机隐藏命令大全
  5. 可转债的投资价值算法
  6. iscsi:IO操作流程(一)
  7. 投资赚钱发财, 财务自由,需要如下几个因素
  8. 文本主题模型之LDA(二) LDA求解之Gibbs采样算法
  9. es6箭头函数内部判断
  10. ElastcSearch的Mapping映射建立
  11. PyCharm免费版安装使用
  12. 在线制作ico矢量图标
  13. 新浪微博接口在safri下的bug
  14. Linux下查看用户列表和删除用户,详例
  15. HDOJ 5773 The All-purpose Zero
  16. 水哥王昱珩直播解锁华为Mate 20黑科技,超微距效果实力非凡
  17. 【C语言】calloc函数
  18. 鹏鹏seo第三课:长尾关键词的认识!
  19. LabVIEW串口仪器控制
  20. Xamarin.Forms 之我的花园 - 2.从照片库选择图片和拍照功能

热门文章

  1. Arm发布移动端v9体系新架构,CPU、GPU、IP全囊括了!
  2. 【快讯】呼伦贝尔市人民医院利用Oracle APEX快速开发预检分诊系统
  3. 被嫌弃的互联网的 “一生”(上)
  4. 秒杀场景_多线程异步抢单队列分析与实现_02
  5. plsql 快捷键设置
  6. 把百度网站设为首页_大仙SEO:如何解决网站首页百度收录后被删除?【SEO案例】...
  7. android padding作用,android:padding和android:layout_margin的区别
  8. Qt下简单的文件读取
  9. jq之animate()操作多个属性
  10. 在php中图片放大怎么实现,用PHP实现图片的缩放与裁剪