1.首先创建两个数据库,分别为first和second,简单创建一张表各插入一条数据作为演示:
first数据库,表t_user
second数据库,表t_user
----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.验证结果:
总结:
借助抽象类AbstractRoutingDataSource可以根据key路由目标数据源,在需要切换数据源的地方手动标记,切换到对应的数据源即可。