springboot多数据源配置理解
今天研究项目的多数据源配置,产生了一点疑惑,有很多地方没有指定数据源,那么spring如何知道连接哪一个呢?让我们从头开始梳理吧。
首先是数据源配类

其中使用到了两个数据源,项目采用读写分离,一个主库和一个从库,主写从读,提高并发性能。@Primary注解的作用是优先使用这个bean,并且在启动类@SpringBootApplication中设置排除掉DataSourceAutoConfiguration.class,因为springboot项目会自动加载。然后是动态数据源配置类。

如图,我们用ThreadLocal来存储数据源类型,并且设置切面。切面如下

大概的逻辑就是,在所用使用了@DataSource注解的地方进行aop,取出注解的值(不存在则默认为master),将值设置进去,完成数据源的切换。那么问题来,我看很多地方并没有使用到@DataSource这个注解,那么spring是如何选择相应的数据源的呢?再次分析代码,发现DynamicDataSource中重写了父类determineCurrentLookupKey()方法,这个方法就是返回查找当前数据源的key。在构造DynamicDataSource时我们传入了默认数据源,和一个存储所有可选数据源的map,我们可以根据这个key去定位具体想使用的数据源。

点击进入父类方法,发现真正决策出数据源的方法是determineTargetDataSource()。它首先判断所有可选数据源map不为空,然后调用我们重写的determineCurrentLookupKey()方法找出当前数据源的key,如果这个key为null或者通过key在map中查找的数据源为null,则使用默认数据源

默认的数据源就是我们一开始构造DynamicDataSource传入的,

defaultTargetDataSource就是我们传入的master数据源,这里通过resolveSpecifiedDataSource()做了一层适配,如果defaultTargetDataSource是dataSource类型则直接返回,如果不是则把它当成key去所有可选数据源map中查。这里不得不说spring的作者真牛啊,方方面面都考虑到了。

通过这一通分析下来,这才解开最开始的问题,为什么很多地方没有指定数据源,甚至没有通过切面,也可以找到数据源。因为不指定用的都是默认的数据源,只需要在用到其他数据源的地方指定就可以了,我们只需要完成数据源的初始化编写工作即可。
springboot多数据源配置理解的更多相关文章
- Springboot 多数据源配置,结合tk-mybatis
一.前言 作为一个资深的CRUD工程师,我们在实际使用springboot开发项目的时候,难免会遇到同时使用多个数据库的情况,比如前脚刚查询mysql,后脚就要查询sqlserver. 这时,我们很直 ...
- 基于注解实现SpringBoot多数据源配置
1.功能介绍 在实际的开发中,同一个项目中使用多个数据源是很常见的场景.最近在学习的过程中使用注解的方式实现了一个Springboot项目多数据源的功能.具体实现方式如下. 2.在applicatio ...
- Spring-Boot 多数据源配置+动态数据源切换+多数据源事物配置实现主从数据库存储分离
一.基础介绍 多数据源字面意思,比如说二个数据库,甚至不同类型的数据库.在用SpringBoot开发项目时,随着业务量的扩大,我们通常会进行数据库拆分或是引入其他数据库,从而我们需要配置多个数据源. ...
- springboot+多数据源配置
作者:纯洁的微笑 出处:http://www.ityouknow.com/ 起多数据源,一般都来解决那些问题呢,主从模式或者业务比较复杂需要连接不同的分库来支持业务.我们项目是后者的模式,网上找了很多 ...
- Springboot多数据源配置--数据源动态切换
在上一篇我们介绍了多数据源,但是我们会发现在实际中我们很少直接获取数据源对象进行操作,我们常用的是jdbcTemplate或者是jpa进行操作数据库.那么这一节我们将要介绍怎么进行多数据源动态切换.添 ...
- SpringBoot多数据源配置
准备环境: jdk1.8 eclipse tomcat8.0 第一步:在配置文件添加如下信息: spring.datasource.primary.url=jdbc:mysql://localhost ...
- SpringBoot多数据源配置事务
除了消费降级,这将会是娱乐继续下沉的一年. 36氪从多个信源处获悉,资讯阅读应用趣头条已经完成了腾讯领投的Pre-IPO轮融资,交易金额预计达上亿美元,本轮融资估值在13-15亿美金之间:完成此轮融资 ...
- SpringBoot常用数据源配置
#mysql8.X url: jdbc:mysql://localhost:3306/yourdbname?serverTimezone=UTC&useSSL=false&allowP ...
- springboot v2.0.3版本多数据源配置
本篇分享的是springboot多数据源配置,在从springboot v1.5版本升级到v2.0.3时,发现之前写的多数据源的方式不可用了,捕获错误信息如: 异常:jdbcUrl is requir ...
- springboot之多数据源配置JdbcTemplate
springboot多数据源配置,代码如下 DataSourceConfig package com.rookie.bigdata.config; import org.springframework ...
随机推荐
- 从零开始配置vim(21)——lsp简介与treesitter 配置
截止到上一篇文章,我们配置了neovim的很多内容了.具备了一些编辑器的常用功能了,而且可以胜任日常的文档编辑工作了.但是想作为一个可靠的代码编辑器还缺少重要的一环,即代码语法部分的支持. 在过去的v ...
- PostgreSQL中的B-TREE索引
分析了解pgsql中的索引 前言 索引 B-tree B-Tree和B+Tree的区别: pgsql中B-Tree 实现 如果该节点不是最右节点 如果该节点是最右节点 参考 分析了解pgsql中的索引 ...
- 我手写了一个RPC框架。成功帮助读者斩获字节、阿里等大厂offer。
本着开源精神,本项目README已经同步了英文版本.另外,项目的源代码的注释大部分也修改为了英文. 如访问速度不佳,可放在 Gitee 地址:https://gitee.com/SnailClimb/ ...
- Matplotlib配置图例legend()设置透明和并排显示
1.多排显示 x=np.linspace(start=-np.pi,stop=np.pi,num=300) plt.style.use('classic') Fig,Axes=plt.subplots ...
- 【栈和队列】纯C实现栈和队列以及其基本操作-宝藏级别数据结构教程【保姆级别详细教学】
[栈和队列]栈和队列的C语言实现-宝藏级别数据结构教程-超详细的注释和解释 先赞后看好习惯 打字不容易,这都是很用心做的,希望得到支持你 大家的点赞和支持对于我来说是一种非常重要的动力 看完之后别忘记 ...
- 下载、安装Git并拷贝GitHub项目到本地的流程
本文介绍分布式开源版本控制系统Git的下载.安装,并基于Git实现克隆GitHub中项目代码的方法. Git是一款开源软件,因此我们直接在Git的官方下载地址下载最新版本的Git即可.其中,在 ...
- C# 二十年语法变迁之 C# 8参考
C# 二十年语法变迁之 C# 8参考 自从 C# 于 2000 年推出以来,该语言的规模已经大大增加,我不确定任何人是否有可能在任何时候都对每一种语言特性都有深入的了解.因此,我想写一系列快速参考文章 ...
- Power BI 13 DAY
分组依据 在PQ下对维度进行汇总,并对其他字段进行不同的计算方式,就需要使用分组依据 将下表中已"店名"为维度对重复店名作排重处理,对"单号"字段进行计数计算, ...
- NC19325 游戏
题目链接 题目 题目描述 BLUESKY007,fengxunling和dreagonm三个人发现了一个像素游戏,这款神奇的游戏每次会生成一个nxm的网格,其中每一个格子都被随机染色为R,G,B三种颜 ...
- adb查看和修改settings值
初始化命令 对应USB连接的安卓设备 # 用help查看版本,位置和参数 >adb --help Android Debug Bridge version 1.0.41 Version 30.0 ...