多数据源切换,首先需要实例化多个数据源DataSource,这里以两个数据源为例,多个数据源类似。程序的处理单元是线程,所以我们借助ThreadLocal动态设置当前线程的数据源实例。最后我们需要写一个AOP,拦截需要切换数据源的方法,在拦截器里实现数据源修改。项目以springboot2结合druid,mysql,mybatis为例。

1.首先创建两个数据库,分别为first和second,简单创建一张表各插入一条数据作为演示:   

first数据库,表t_user

【springboot】配置多数据源动态切换_java

second数据库,表t_user

【springboot】配置多数据源动态切换_java_02

----2.实例化两个数据源,简单配置下数据源相关属性:

com.mysql.cj.jdbc.Driver
      jdbc:mysql://127.0.0.1:3306/first?charset=utf8mb4&useSSL=false
      root
      123456
    com.mysql.cj.jdbc.Driver
      jdbc:mysql://127.0.0.1:3306/second?charset=utf8mb4&useSSL=false
      root
      123456

初始化动态数据源,设置默认数据源,根据key路由到对应数据源

DruidDataSourceConfiguration DataSource DruidDataSourceBuilder..buildDataSource DruidDataSourceBuilder..buildDynamicDataSource DataSource firstDataSourceDataSource secondDataSourceDynamicDataSource dynamicDataSource = DynamicDataSourcedynamicDataSource.setDefaultTargetDataSourcefirstDataSourceMapObjectObjecttargetDataSources = HashMaptargetDataSources.putfirstDataSourcetargetDataSources.putsecondDataSourcedynamicDataSource.setTargetDataSourcestargetDataSourcesdynamicDataSource

在ThreadLocal中设置线程持有的数据源:

DynamicDataSource AbstractRoutingDataSource ThreadLocalString= ThreadLocalString name.infoname.setnameString .get.removeObject .infoDynamicDataSource.DynamicDataSource.

----

3.编写自定义注解,需要切换数据源的地方添加注解:

ElementType.RetentionPolicy.@String

----

4.编写AOP,处理自定义注解

DynamicDataSourceAspect =dataSource= dataSourceDynamicDataSource.dataSource.value= dataSourceDynamicDataSource.

----

5.测试,使用idea插件EasyCode快速生成代码,参见EasyCode插件使用

TUser String datatsourceInteger id.equalsdatatsource..queryByIdSecondid..queryByIdid

在service中添加一个自定义注解的方法:

TUser Integer id..queryByIdidTUser Integer id..queryByIdid

----6.验证结果:

【springboot】配置多数据源动态切换_java_03

【springboot】配置多数据源动态切换_java_04

总结:

借助抽象类AbstractRoutingDataSource可以根据key路由目标数据源,在需要切换数据源的地方手动标记,切换到对应的数据源即可。