SpringBoot整合AbstractRoutingDataSource實現讀寫分離


在配置數據源時候,已經把主庫和從庫的數據源配置到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下載地址:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM