在配置數據源時候,已經把主庫和從庫的數據源配置到DynamicDataSource里了
利用AbstractRoutingDataSource實現動態切換數據源,可以通過注解或者根據方法名前綴切換要使用的數據源
這里主庫和從庫要做主從同步,這樣就實現了數據庫的讀寫分離
AOP的執行順序 ,order值越小,越先被執行
/** * order 的值越小,說明越先被執行 * */ @Aspect @Component @Order(0) @Slf4j public class DataSourceAspect{ /** * 注解方式 * @param joinPoint * @param dataSource */ @Before(value = "@annotation(dataSource)") public void dataSourcePoint(JoinPoint joinPoint, DataSource dataSource) { DynamicDataSourceHolder.putDataSource(dataSource.value()); log.info("通過注解 dataSource 切換到:{}",dataSource.value()); } }
@Aspect @Component @Order(-1) @Slf4j public class DataSourcePartAspect { /** * mapper 查詢操作默認使用從庫 */ @Before("execution(* com..service..*.select*(..)) || execution(* com..service..*.get*(..))|| execution(* com..service..*.query*(..))") public void setReadDataSourceType() { DynamicDataSourceHolder.putDataSource(DataSourceType.SLAVE); log.info("dataSource 切換到:{}",DataSourceType.SLAVE.getName()); } /** * mapper 修改刪除操作默認使用主庫庫 */ @Before("execution(* com..service..*.insert*(..)) || execution(* com..service..*.update*(..)) || execution(* com..service..*.delete*(..))") public void setWriteDataSourceType() { DynamicDataSourceHolder.putDataSource(DataSourceType.MASTER); log.info("dataSource 切換到:{}",DataSourceType.MASTER.getName()); } }
項目結構:
github下載地址: