1 认识AbstractRoutingDataSource抽象类

这个抽象类是我们实现动态切换数据源的关键,从它的名字我们可以知道是路由数据源

读写分离 - 动态切换数据源

从源码我们可以很清楚的知道我们覆盖方法determineCurrentLookupKey(),动态地把lookupKey传进去,resolvedDataSources是map类型是key - value类型,key存着lookupKey,value是数据源

DataSource dataSource = this.resolvedDataSources.get(lookupKey);根据你传的lookupKey返回对应的数据源

如果你没有传lookupKey,则返回预先设定好的默认数据源 dataSource = this.resolvedDefaultDataSource;

2 定义数据源

上面源码已经分析了你可以动态地指定数据源也可以使用默认的数据源,那我们就把我们配置好的传进去

读写分离 - 动态切换数据源

我们可以清楚看见初始化目标数据源Map targetDataSources和初始化默认目标数据源defaultTargetDataSource

覆盖此方法,之前传入defaultTargetDataSource和targetDataSources

3 定义事务管理器

目前我们的环境是1台主数据库(增删改操作),一台从数据库(查操作),我们可以设置默认数据源是从数据库,当我们进行增删改操作时,可以通过注解@Transactional,通过事务管理器设置动态设置lookupKey,走主数据库

4 注意事项

springboot会自动装配数据源,因为我们现在是自定义数据源,所以记得屏蔽DataSourceAutoConfiguration

@Primary注解的使用

相关文章: