日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
多數(shù)據(jù)源管理:掌握@DS注解的威力

大家在日常后端開發(fā)過程,不可避免的會接觸到需要用到配置多個數(shù)據(jù)源的場景,在這里,小編介紹一種簡單方便的,只需要簡單的配置和一個@DS注解就能實現(xiàn)動態(tài)數(shù)據(jù)源的方式,這種動態(tài)數(shù)據(jù)源底層原理是基于Mybatis-plus來實現(xiàn)的。

1、配置方式

首先是pom.xml

    
    com.baomidou    
    dynamic-datasource-spring-boot-starter    
    3.4.1

隨后配上多數(shù)據(jù)源,我們的項目中分別配置了Mysql和Doris兩種數(shù)據(jù)庫

spring:  
    datasource:    
        druid:      
            localdb:        
                url: xxx        
                username: xxx     
                driver-class-name: com.mysql.jdbc.Driver        
                type: com.alibaba.druid.pool.DruidDataSource      
            doris:       
                url: xxx        
                username: xxx
                driver-class-name: com.mysql.jdbc.Driver        
                type: com.alibaba.druid.pool.DruidDataSource

最后需要使用哪個數(shù)據(jù)庫,在對應的方法上加上對應的@DS(“數(shù)據(jù)庫名”)注解就可以了,在類上加@DS(“數(shù)據(jù)庫名”),那么整個類下的所有方法都會使用到這個數(shù)據(jù)源,實現(xiàn)方式是不是非常簡單。

@Service
@DS("localdb")
public class testServiceImpl extends BaseServiceImpl implements testService {

    public void save(String arg1) {
       //TODO
    }
    
    public void find(String arg2) {
       //TODO
    }
}

2、底層實現(xiàn)原理

底層實現(xiàn)核心類是
com.baomidou.dynamic.datasource.DynamicRoutingDataSource,繼承自AbstractDataSource

項目在初始化的時候會調(diào)用DynamicRoutingDataSource里面的public synchronized void addDataSource(String ds, DataSource dataSource)方法加載數(shù)據(jù)源,數(shù)據(jù)源存進dataSourceMap中。

隨后,如果進行數(shù)據(jù)庫操作,以方法為最小粒度,執(zhí)行對應方法時,會被
DynamicDataSourceAnnotationInterceptor攔截器攔截

執(zhí)行determineDatasource方法,掃描加了@DS注解的類或者方法,隨后調(diào)用DynamicDataSourceContextHolder.poll方法。

DynamicDataSourceContextHolder.poll方法將當前線程的數(shù)據(jù)源名加到對應的ThreadLocal線程本地中

在之后的數(shù)據(jù)操作中,會調(diào)用org.springframework.jdbc.datasource.getConnection()方法,ThreadLocal中獲取之前攔截器存進去動態(tài)數(shù)據(jù)源名,如果沒有獲取到,就默認為配置的primary數(shù)據(jù)源,這完成了對應的動態(tài)數(shù)據(jù)源切換。

3、總結

基于Mybatis-plus的@DS注解可以實現(xiàn)動態(tài)數(shù)據(jù)源切換,具有實現(xiàn)簡單的優(yōu)點,雖然沒有AOP實現(xiàn),但是用到了AOP的思想,后續(xù)小編將寫一篇基于AOP的實現(xiàn)方式,歡迎大家關注。

作者:京東保險 郭盼

來源:京東云開發(fā)者社區(qū) 轉載請注明來源


當前文章:多數(shù)據(jù)源管理:掌握@DS注解的威力
鏈接URL:http://www.5511xx.com/article/cdijgie.html