自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

多數(shù)據(jù)源管理:掌握@DS注解的威力

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

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

1、配置方式

首先是pom.xml

<dependency>    
    <groupId>com.baomidou</groupId>    
    <artifactId>dynamic-datasource-spring-boot-starter</artifactId>    
    <version>3.4.1</version>
</dependency>

隨后配上多數(shù)據(jù)源,我們的項(xiàng)目中分別配置了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

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

@Service
@DS("localdb")
public class testServiceImpl extends BaseServiceImpl<testMapper, testBean> implements testService {

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

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

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

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

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

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

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

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

3、總結(jié)

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

作者:京東保險(xiǎn) 郭盼

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

責(zé)任編輯:武曉燕 來源: 今日頭條
相關(guān)推薦

2024-10-30 10:22:17

2020-12-31 07:55:33

spring bootMybatis數(shù)據(jù)庫

2023-09-07 08:39:39

copy屬性數(shù)據(jù)源

2023-11-27 07:33:55

2009-08-14 10:26:27

ibatis多數(shù)據(jù)源

2023-06-07 08:08:37

MybatisSpringBoot

2020-11-24 09:56:12

數(shù)據(jù)源讀寫分離

2020-03-13 14:05:14

SpringBoot+數(shù)據(jù)源Java

2020-06-02 07:55:31

SpringBoot多數(shù)據(jù)源

2022-05-18 12:04:19

Mybatis數(shù)據(jù)源Spring

2023-01-04 09:33:31

SpringBootMybatis

2022-05-10 10:43:35

數(shù)據(jù)源動(dòng)態(tài)切換Spring

2022-12-19 07:21:35

Hutool-db數(shù)據(jù)庫JDBC

2017-07-21 14:50:15

數(shù)據(jù)庫DB分庫事務(wù)處理

2023-10-18 15:25:29

數(shù)據(jù)源數(shù)據(jù)庫

2017-09-04 14:52:51

Tomcat線程數(shù)據(jù)源

2012-06-17 13:04:45

2022-01-12 17:39:16

Spring多租戶數(shù)據(jù)

2025-04-14 01:00:00

Calcite電商系統(tǒng)MySQL

2010-12-27 09:59:11

ODBC數(shù)據(jù)源
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)