今天研究项目的多数据源配置,产生了一点疑惑,有很多地方没有指定数据源,那么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多数据源配置理解的更多相关文章

  1. Springboot 多数据源配置,结合tk-mybatis

    一.前言 作为一个资深的CRUD工程师,我们在实际使用springboot开发项目的时候,难免会遇到同时使用多个数据库的情况,比如前脚刚查询mysql,后脚就要查询sqlserver. 这时,我们很直 ...

  2. 基于注解实现SpringBoot多数据源配置

    1.功能介绍 在实际的开发中,同一个项目中使用多个数据源是很常见的场景.最近在学习的过程中使用注解的方式实现了一个Springboot项目多数据源的功能.具体实现方式如下. 2.在applicatio ...

  3. Spring-Boot 多数据源配置+动态数据源切换+多数据源事物配置实现主从数据库存储分离

    一.基础介绍 多数据源字面意思,比如说二个数据库,甚至不同类型的数据库.在用SpringBoot开发项目时,随着业务量的扩大,我们通常会进行数据库拆分或是引入其他数据库,从而我们需要配置多个数据源. ...

  4. springboot+多数据源配置

    作者:纯洁的微笑 出处:http://www.ityouknow.com/ 起多数据源,一般都来解决那些问题呢,主从模式或者业务比较复杂需要连接不同的分库来支持业务.我们项目是后者的模式,网上找了很多 ...

  5. Springboot多数据源配置--数据源动态切换

    在上一篇我们介绍了多数据源,但是我们会发现在实际中我们很少直接获取数据源对象进行操作,我们常用的是jdbcTemplate或者是jpa进行操作数据库.那么这一节我们将要介绍怎么进行多数据源动态切换.添 ...

  6. SpringBoot多数据源配置

    准备环境: jdk1.8 eclipse tomcat8.0 第一步:在配置文件添加如下信息: spring.datasource.primary.url=jdbc:mysql://localhost ...

  7. SpringBoot多数据源配置事务

    除了消费降级,这将会是娱乐继续下沉的一年. 36氪从多个信源处获悉,资讯阅读应用趣头条已经完成了腾讯领投的Pre-IPO轮融资,交易金额预计达上亿美元,本轮融资估值在13-15亿美金之间:完成此轮融资 ...

  8. SpringBoot常用数据源配置

    #mysql8.X url: jdbc:mysql://localhost:3306/yourdbname?serverTimezone=UTC&useSSL=false&allowP ...

  9. springboot v2.0.3版本多数据源配置

    本篇分享的是springboot多数据源配置,在从springboot v1.5版本升级到v2.0.3时,发现之前写的多数据源的方式不可用了,捕获错误信息如: 异常:jdbcUrl is requir ...

  10. springboot之多数据源配置JdbcTemplate

    springboot多数据源配置,代码如下 DataSourceConfig package com.rookie.bigdata.config; import org.springframework ...

随机推荐

  1. vim 从嫌弃到依赖(3)——vim 普通模式

    在上一篇中,我们提到vim的几种模式,并且给出了一些基本的操作命令,包括移动光标,删除.替换操作.并且给出了几个重要的公式,理解这个公式对于理解vim和提高使用vim的效率来说至关重要.所以在这篇文章 ...

  2. Flask WTForms 表单插件的使用

    在Web应用中,表单处理是一个基本而常见的任务.Python的WTForms库通过提供表单的结构.验证和渲染等功能,简化了表单的处理流程.与此同时,Flask的扩展Flask-WTF更进一步地整合了W ...

  3. 8.10 TLS线程局部存储反调试

    TLS(Thread Local Storage)用来在进程内部每个线程中存储私有的数据.每个线程都会拥有独立的TLS存储空间,可以在TLS存储空间中保存线程的上下文信息.变量.函数指针等.TLS其目 ...

  4. 从嘉手札<2023-11-18>

    随便补一个~ 1.我也不是不快乐,我其实挺快乐的,和朋友出去玩,看电影,刷搞笑视频,我都能表现的很好,但这些都不是真正让我感受到快乐的东西,它就像膝跳反应一样,碰我一下我就会笑,但笑完就结束了.甚至在 ...

  5. 手把手教你-把Kali Linux系统安装到U盘 【超详细】(随身携带/即插即用)

    [0-背景说明]: 1)为什么想要把Kali Linux系统安装到U盘? 之前学习渗透测试的时候,有安装过虚拟机,在虚拟机上安装Kali Linux系统,但是因为是在现有系统上安装虚拟机又安装kali ...

  6. System.SysUtils.TStringHelper 详解,注意事项

    大小写转换: function ToLower: string; function ToLower(LocaleID: TLocaleID): string; function ToLowerInva ...

  7. NC24755 [USACO 2010 Dec S]Apple Delivery

    题目链接 题目 题目描述 Bessie has two crisp red apples to deliver to two of her friends in the herd. Of course ...

  8. CF505C Mr. Kitayuta, the Treasure Hunter

    题目链接 题目 见链接. 题解 知识点:线性dp. 常规的状态 \(dp[i][j]\) 表示为到第 \(i\) 个岛上一步走了 \(j\) 能得到宝藏的最大值,会炸空间.注意到步数是就算从 \(1\ ...

  9. PCIE详解

    老男孩读PCIe之一:从PCIe速度说起 从今天开始,老男孩要开始讲PCIe了.对我来说,这是个很大的挑战:首先,我自己本身,对PCIe并没有做到胸有成竹,我的PCIe知识也只是停留在理论阶段,我并没 ...

  10. 使用V2R做反向代理内网穿透

    环境 内网服务器Prob1位于内网LAN1, 内网服务器Prob2位于内网LAN2, 外网服务器Serv1位于IP 123.123.123.123 内网节点配置 内网节点没有inbound,只需要配置 ...