如果一个数据库数据量过大,考虑到分库分表和读写分离需要动态的切换到相应的数据库进行相关操作,这样就会有多个数据源。对于一个数据源的配置在Spring Boot数据访问之数据源自动配置 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)Spring Boot数据访问之Druid连接池的配置 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中均有涉及,不同之处在于数据库连接池不一样:前者有Spring Boot提供,后者使用第三方提供的数据库连接池。

  那么对于多数据源的数据库应该如何配置呢?首先看最简单的多数据源配置:

    

    

    

  测试案例:pojo之类的就不截图了,仅截图测试类如下:

    

  测试结果:

    

  实际上两个数据库中的数据并不一样:

    

  但是测试时访问的都是master数据库。那slave数据库根本无法访问到,实际生产中肯定在某些时候一定访问slave,这么解决呢?动态切换数据源。

  Spring内置了一个AbstractRoutingDataSource帮助完成动态数据源切换。下面先看这个抽象类:

    

  阅读源码可知其中一个核心的方法setTargetDataSourcese,它需要一个Map。这个Map存储的就是我们配置的多个数据源的键值对。其切换数据源的运作方式就是在连接数据库之前执行determineCurrentLookupKey方法返回的数据作为key去targetDataSources中查找相应的值,找到就用此DataSource获取数据库链接。

  此类是抽象类,如果使用话,最有效的方式就是创建其的一个子类并实现获取key的方法determineCurrentLookupKey——即写我们自己的规则获取相应数据源。

  以上面的测试案例示例:

    重写determineCurrentLookupKey:

      

      

    配置类中增加主数据源配置:

      

    修改测试案例:

      

    测试结果:

      

  实现了数据源的动态切换。

Spring Boot数据访问之多数据源配置及数据源动态切换的更多相关文章

  1. Spring Boot数据访问之动态数据源切换之使用注解式AOP优化

    在Spring Boot数据访问之多数据源配置及数据源动态切换 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中详述了如何配置多数据源及多数据源之间的动态切换.但是需要读数据库的地方,就 ...

  2. Spring Boot数据访问之Druid连接池的配置

    在Spring Boot数据访问之数据源自动配置 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中数据源连接池方式缺省(type)情况下默认使用HikariCP,那不缺省如何配置呢?我们 ...

  3. 06.深入浅出 Spring Boot - 数据访问之Druid

    代码下载:https://github.com/Jackson0714/study-spring-boot.git 一.Druid是什么? 1.Druid是数据库连接池,功能.性能.扩展性方面都算不错 ...

  4. 07.深入浅出 Spring Boot - 数据访问之Mybatis(附代码下载)

    MyBatis 在Spring Boot应用非常广,非常强大的一个半自动的ORM框架. 代码下载:https://github.com/Jackson0714/study-spring-boot.gi ...

  5. Spring Boot数据访问之整合Mybatis

    在Mybatis整合Spring - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中谈到了Spring和Mybatis整合需要整合的点在哪些方面,需要将Mybatis中数据库连接池等相关对 ...

  6. Spring Boot数据访问之数据源自动配置

    Spring Boot提供自动配置的数据访问,首先体验下,Spring Boot使用2.5.5版本: 1)导入坐标: 2.5.25版本支持8.0.26mysql数据库驱动.spring-boot-st ...

  7. Spring Boot 数据访问集成 MyBatis 与事物配置

    对于软件系统而言,持久化数据到数据库是至关重要的一部分.在 Java 领域,有很多的实现了数据持久化层的工具和框架(ORM).ORM 框架的本质是简化编程中操作数据库的繁琐性,比如可以根据对象生成 S ...

  8. Spring Boot 系列(三)属性配置&自定义属性配置

    在使用spring boot过程中,可以发现项目中只需要极少的配置就能完成相应的功能,这归功于spring boot中的模块化配置,在pom.xml中依赖的每个Starter都有默认配置,而这些默认配 ...

  9. 【spring boot】12.spring boot对多种不同类型数据库,多数据源配置使用

    2天时间,终于把spring boot下配置连接多种不同类型数据库,配置多数据源实现! ======================================================== ...

随机推荐

  1. VsCode安装与配置

    一.安装 二.配置 开启emmet完整的语法 文件-首选项-设置:Emmet: Trigger Expansion On Tab 三.常用插件 必装: Chinese (Simplified) Lan ...

  2. 如何提高docker容器的安全性

    一. 概述 Docker 容器一直是开发人员工具箱的重要组成部分,使开发人员能够以标准化的方式构建.分发和部署他们的应用程序.毫无疑问,这种吸引力的增加伴随着容器化技术的相关安全问题.他们可以很容易地 ...

  3. linux base脚本编写-自动领取微信红包

    bash脚本编写 语法 变量 定义: your_name = "ABC" 使用: echo $your_name 只读变量 a = "123" readonly ...

  4. Cesium中级教程5 - Terrain 地形

    Cesium中文网:http://cesiumcn.org/ | 国内快速访问:http://cesium.coinidea.com/ CesiumJS支持对与水流相关的海洋.湖泊和河流以及全球高分辨 ...

  5. Typora破解

    Typora破解 需要python环境,没有的话需要先安装一下 访问 https://github.com/Mas0nShi/typoraCracker.git下载下来破解需要的压缩包并且解压缩 或者 ...

  6. Android 资源溢出崩溃轻松解

    作者:字节跳动终端技术-李权飞 资源溢出是什么? 毫无疑问,应用的运行需要占用系统的资源.其中最为人所熟知的资源是内存,内存溢出便是耳熟能详的OOM. 常见的简单OOM一般可以通过堆栈来解决,如Jav ...

  7. python 小兵(12)模块1

    序列化 我们今天学习下序列化,什么是序列化呢? 将原本的字典.列表等内容转换成一个字符串的过程就叫做序列化. 为什么要有序列化模块: 比如,我们在python代码中计算的一个数据需要给另外一段程序使用 ...

  8. ApacheCN Python 译文集 20211108 更新

    Think Python 中文第二版 第一章 编程之路 第二章 变量,表达式,语句 第三章 函数 第四章 案例学习:交互设计 第五章 条件循环 第六章 有返回值的函数 第七章 迭代 第八章 字符串 第 ...

  9. JavaScript闭包的那些事

    JavaScript闭包 1.函数在JavaScript中的地位 在介绍闭包之前,可以先聊聊函数在JavaScript中的地位,因为闭包的存在是与函数息息相关的. JavaScript之所以可以称之为 ...

  10. 封装jar问题java.lang.SecurityException: Invalid signature file digest for Manifest main attributes以及maven依赖重提解决

    1.jar包封装完成后,其他项目引用jar,启动时报错java.lang.SecurityException: Invalid signature file digest for Manifest m ...