1. 若依多数据源分析

1.1 介绍

若依使用Spring提供的AbstractRoutingDataSource实现每次请求,动态获取指定的数据源

使用DataSourceType枚举定义多个数据源标识

使用DynamicDataSourceContextHolder中的ThreadLocal变量存储当前线程的使用数据源标识

使用DruidConfig配置多数据源的Bean注入和AbstractRoutingDataSourceBean的注入。在其中,使用DruidProperties获取多数据源的通用配置

使用DataSource注解+切面DataSourceAspect实现根据service方法上的注解,实现放入数据源标记。在执行方法的时候,经由AbstractRoutingDataSource根据当前线程的标记,来动态使用某个数据源

1.2 多数据源接口流程图

在这里插入图片描述

1.3 自定义实现步骤

  1. 配置yml配置文件,配置多数据源。
  2. 定义配置类,使用@ConfigurationProperties或者是@Value注入配置属性
  3. 定义一个多数据源管理类,加载多个数据源,放入一个Map中,key为数据源标识,可以使用枚举定义,value为Datasource对象
  4. 定义一个DynamicDataSourceContextHolder,定义ThreadLocal对象放入当前线程使用的数据源标识
  5. 定义AbstractRoutingDataSource实现类,设置所有的数据源和默认的数据源。重写determineCurrentLookupKey方法,返回DynamicDataSourceContextHolder中ThreadLocal的数据源标识
  6. 定义DataSource注解,可以标识类或者方法,作用于Service。可以指定当前方法使用哪个数据源
  7. 定义切面DataSourceAspect,根据DataSource注解中的标识,放入DynamicDataSourceContextHolder中共的ThreadLocal对象中

这样就可以实现加入注解后,可以根据动态根据注解切换数据源

1.4 用途

这种方式一般使用在业务分库的情况下。如果主从,需要加很多额外的代码保证功能。

读写分离建议使用Mybatis的Sql拦截,分析是否SELECT语句,来分配主库和从库。

或者直接使用现成的工具或者中间件搞定。

Logo

快速构建 Web 应用程序

更多推荐