首页 > 其他分享 >多数据源切换和部分原理解说

多数据源切换和部分原理解说

时间:2023-09-22 11:57:23浏览次数:26  
标签:jdbc 数据源 xxx master 切换 mysql DS 解说

MybatisPlus作为mybatis的增强工具,提供了配置多数据源的扩展,通过简单的3步配置,即可使用注解轻松切换数据源。

1.  引入坐标

<!--      dynamic-datasource多数据源坐标-->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
    <version>3.6.1</version>
</dependency>

2. 配置数据源

spring:

  #mysql 数据源

  datasource:

    type: com.zaxxer.hikari.HikariDataSource

    dynamic:

      primary: master   # 默认主库名为master

      datasource:

        master:

          driver-class-name: com.mysql.cj.jdbc.Driver

          url:jdbc:mysql://xxx.xxx.xxx.xxx:xxx/xxx?xxxxxx

          username: xxxxxxx

          password: xxxxxxx

        secondary:

          driver-class-name: com.mysql.cj.jdbc.Driver

          url:jdbc:mysql://xxx.xxx.xxx.xxx:xxx/xxx?xxxxxx

          username: xxxxxxx

          password: xxxxxxx

        third:

          driver-class-name: com.mysql.cj.jdbc.Driver

          url:jdbc:mysql://xxx.xxx.xxx.xxx:xxx/xxx?xxxxxx

          username: xxxxxxx

          password: xxxxxxx

 

3. 在方法或者类上使用@DS切换数据源

a. DS注解既可以写在类上,也可以写在方法上,方法上的优先级高于类。

b. 如果没有指定DS的属性值或者没有使用DS注解,就自动走master主库。

通过以上3步,就可以轻松使用切换多数据源的能力了。当然,除了支持主从模式,还支持多主多从、多库,混合模式。

@Service
@DS("secondary")
public class  ServiceImpl implements Service {
    @Override
    public List List() {
        // TODO......
        return null;
    }
    @Override
    @DS("master")
    public List master() {
        // TODO......
        return null;
    }
    @Override
    @DS("secondary")
    public List secondary() {
        // TODO......
        return null;
    }
    @Override
    @DS("third")
    public List third() {
        // TODO......
        return null;
    }

原理探究

  1. 打开dynamic-datasource-spring-boot-starter.jar包,在spring.factories文件中,可以看到配置了DynamicDataSourceAutoConfiguration启动类。
  1. 打开DynamicDataSourceAutoConfiguration类,可以看到通过@AutoConfigureBefore注解,提前初始化了MP自己的DataSource数据源。
  1. 而DataSourceAutoConfiguration类的核心作用就是初始化DataSrouce,MP通过抢先配置的方式,使DataSource变成了自己指定的数据源。

除了初始化MP自己的数据源,DynamicDataSourceAutoConfiguration类还做了一些其他的初始化工作,比如DynamicDataSourceProperties配置,初始化DS注解的切面Advisor等。

初始化工作做完以后,接下来就是根据DS注解判断走哪个数据源了。

  1. DynamicDataSourceAnnotationInterceptor类是一个方法拦截器,它的invoke里面有判断DS key的操作。
  1. 在determineDatasourceKey方法中,会调用提前注入DataSourceClassResolver类的findKey方法,判断类或者方法上是否指定了DS注解。

.......

标签:jdbc,数据源,xxx,master,切换,mysql,DS,解说
From: https://www.cnblogs.com/yswsxf/p/17721979.html

相关文章

  • 页面切换到后台,再切回时跳转页面
    document.addEventListener('visibilitychange',function(){letpageVisibility=document.visibilityState;//页面变为不可见时触发if(pageVisibility=='hidden'){console.log("离开时间点:"+newDat......
  • css实现文字切换
    .textc{--num:'今日大吉';animation:text-change3slinearforwards;}.textc::after{content:var(--num);font-size:20px;}@keyframestext-change{33%{--num:'明日好运';}67%{--num:'......
  • 文件/目录的权限和归属 访问权限 读取:允许查看文件内容、显示目录列表 写入:允许修改
    文件/目录的权限和归属 访问权限读取:允许查看文件内容、显示目录列表写入:允许修改文件内容,允许在目录中新建、移动、删除文件或子目录可执行:允许运行程序、切换目录归属(所有权)属主:拥有改文件或目录的用户账号属组:拥有该文件或目录的组账号,组中用户查看文件/目录的权限和归属......
  • Jasper模板使用记录二——JSON文件数据源
    json文件数据源1.新建json文件,并将字段补充完整,示例如下:{ hosp_name:"医院", rows:[{ name:"姓名", age:12, }]}2.新建json数据源,如下:3.新建Jasper文件4.设置数据源,并导入数据源字段至Fields5.通过拖拽Paramter或Field至模板,进行模板设计......
  • 17_freeRTOS 任务状态切换
    freeRTOS任务状态切换eTaskGetState获取状态printf("status%zd\n",osThreadGetState(osThreadGetId()));osThreadSuspend挂起osThreadSuspend(osThreadGetId());......
  • KingbaseES数据库配置Hikari数据源
    Hikari是一个高性能的数据库连接池,它是SpringBoot2.x中的默认数据源。一、下载驱动打开下面网址:选择对应平台的jdbc驱动程序。人大金仓-成为世界卓越的数据库产品与服务提供商(kingbase.com.cn)这里以x86平台为例:下载完成后目录里面包含以下文件:根据项目的JDK版本选择对应......
  • KingbaseES V8R3集群运维案例之---主库数据库服务down后failover切换详解
    案例说明:对KingbaseESV8R3集群,主库数据库服务down后,failover切换进行分析,详解其执行切换的过程,本案例可用于对KingbaseESV8R3集群failover故障的分析参考。适用版本:KingbaseESV8R3集群架构:node_id|hostname|port|status|lb_weight|role|select_cnt......
  • KingbaseES V8R3集群运维案例---failover切换故障分析
    案例说明:KingbaseESV8R3集群主库数据库服务重启后,failover切换失败,分析failover失败的具体原因。适用版本:KingbaseESV8R3一、集群架构node13----->主库(primary)node25----->管理备库(standby)node58----->备库(standby)二、故障现象1主2备集群,172.31.*......
  • 深入理解操作系统中进程与线程的区别及切换机制(上)
    进程所谓进程,大家可以理解为我们打开的应用程序,如微信、QQ、游戏等,但也有系统应用是我们看不见的,可以打开任务管理器一探究竟,我们写的代码程序在服务器上在不运行的情况下,它就是一个二进制文件,并不是进程!一个进程可以包含一个或者多个线程,但对于CPU来说他就是一个任务而已;在早......
  • 深入理解操作系统中进程与线程的区别及切换机制(下)
    前言上一篇文章中我们了解了进程的执行方式,包括早期单核处理器上的顺序执行以及引入多任务概念实现的伪并行。我们还探讨了进程的状态模型。进程可以处于就绪、运行、阻塞和结束等不同的状态。在本篇文章中,我将探讨研究进程的状态模型、控制结构和切换机制。希望通过这篇文章的分......