最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring AbstractRoutingDatasource 動(dòng)態(tài)數(shù)據(jù)源的實(shí)例講解

 更新時(shí)間:2021年07月22日 09:29:47   作者:夢想畫家  
本文介紹如何使用 Spring AbstractRoutingDatasource 基于上下文動(dòng)態(tài)切換數(shù)據(jù)源,因此我們會(huì)讓查找數(shù)據(jù)源邏輯獨(dú)立于數(shù)據(jù)訪問之外

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

數(shù)據(jù)源上下文

AbstractRoutingDatasource 需要信息決定路由到那個(gè)數(shù)據(jù)源,該信息我們稱為上下文??梢允腥魏螌ο?,下面示例我們使用枚舉 ClientDatabase 作為上下文:

public enum ClientDatabase {
    CLIENT_A, CLIENT_B
}

值得注意的是,實(shí)際中上下文可以是任何有意義的領(lǐng)域?qū)ο蟆H?Environment 定義上下文,在這種上下文中枚舉可以包括 PRODUCTION, DEVELOPMENT, and TESTING.

上下文持有者 ( ContextHolder )

上下文持有者實(shí)現(xiàn)是存儲(chǔ)當(dāng)前上下文的容器,如 ThreadLocal 對象。除了包括上下文引用外,還應(yīng)該包括set , get , clear 靜態(tài)方法,AbstractRoutingDatasource 將查詢 ContextHolder 獲得 上下文,然后使用上下文查找實(shí)際的數(shù)據(jù)源。

這里最重要的是使用 ThreadLocal ,讓上下文綁定只當(dāng)前執(zhí)行線程。使用這種方法就是為了保障當(dāng)數(shù)據(jù)訪問邏輯跨多個(gè)數(shù)據(jù)源使用事務(wù):

public class ClientDatabaseContextHolder {
    private static ThreadLocal<ClientDatabase> CONTEXT  = new ThreadLocal<>();
    public static void set(ClientDatabase clientDatabase) {
        Assert.notNull(clientDatabase, "clientDatabase cannot be null");
        CONTEXT.set(clientDatabase);
    }
    public static ClientDatabase getClientDatabase() {
        return CONTEXT.get();
    }
    public static void clear() {
        CONTEXT.remove();
    }
}

數(shù)據(jù)源路由器

下面定義 ClientDataSourceRouter 繼承 AbstractRoutingDataSource. 重寫方法 determineCurrentLookupKey ,查詢 ClientDatabaseContextHolder 獲得當(dāng)前 上下文。AbstractRoutingDataSource 幫我們處理了其他邏輯,僅了解它透明地返回了合適的數(shù)據(jù)源:

public class ClientDataSourceRouter extends AbstractRoutingDataSource {
    @Override
    protected Object determineCurrentLookupKey() {
        return ClientDatabaseContextHolder.getClientDatabase();
    }
}

配置

下面利用Map上下文存儲(chǔ)DataSource對象,用于配置 AbstractRoutingDataSource 。當(dāng)然也可以指定缺省數(shù)據(jù)源,當(dāng)沒有設(shè)定上下文時(shí)選擇缺省數(shù)據(jù)源。

@Configuration
public class RoutingTestConfiguration {
    @Bean
    public ClientService clientService() {
        return new ClientService(new ClientDao(clientDatasource()));
    }
 
    @Bean
    public DataSource clientDatasource() {
        Map<Object, Object> targetDataSources = new HashMap<>();
        DataSource clientADatasource = clientADatasource();
        DataSource clientBDatasource = clientBDatasource();
        targetDataSources.put(ClientDatabase.CLIENT_A, clientADatasource);
        targetDataSources.put(ClientDatabase.CLIENT_B, clientBDatasource);
        ClientDataSourceRouter clientRoutingDatasource  = new ClientDataSourceRouter();
        clientRoutingDatasource.setTargetDataSources(targetDataSources);
        clientRoutingDatasource.setDefaultTargetDataSource(clientADatasource);        
        return clientRoutingDatasource;
    }
    // ...
}

我們可以使用不同方式的數(shù)據(jù)源,但典型場景時(shí)運(yùn)行時(shí)創(chuàng)建,或使用JNDI方式查找。下面定義示例的Dao類,它依賴動(dòng)態(tài)數(shù)據(jù)源進(jìn)行實(shí)例化:

public class ClientDao {
    private static final String SQL_GET_CLIENT_NAME = "select name from client";
    private final JdbcTemplate jdbcTemplate;
    public ClientDao(DataSource datasource) {
        this.jdbcTemplate = new JdbcTemplate(datasource);
    }
    public String getClientName() {
        return this.jdbcTemplate.query(SQL_GET_CLIENT_NAME, rowMapper).get(0);
    }
    private static RowMapper<String> rowMapper = (rs, rowNum) -> {
        return rs.getString("name");
    };
}

使用動(dòng)態(tài)數(shù)據(jù)源

實(shí)際使用時(shí),首先設(shè)置上下文,然后再執(zhí)行業(yè)務(wù)操作。我們定義業(yè)務(wù)層,其中業(yè)務(wù)方法包括上下文作為參數(shù)。在執(zhí)行業(yè)務(wù)之前設(shè)置上下文,調(diào)用之后清除上下文:

public class ClientService {
    private final ClientDao clientDao;
    public ClientService(ClientDao clientDao) {
        this.clientDao = clientDao;
    }
    public String getClientName(ClientDatabase clientDb) {
        ClientDatabaseContextHolder.set(clientDb);
        String clientName = this.clientDao.getClientName();
        ClientDatabaseContextHolder.clear();
        return clientName;
    }
}

總結(jié)

本文通過示例解釋如何使用 Spring AbstractRoutingDataSource 實(shí)現(xiàn) 動(dòng)態(tài)數(shù)據(jù)源切換。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java中4種校驗(yàn)注解詳解(值校驗(yàn)、范圍校驗(yàn)、長度校驗(yàn)、格式校驗(yàn))

    Java中4種校驗(yàn)注解詳解(值校驗(yàn)、范圍校驗(yàn)、長度校驗(yàn)、格式校驗(yàn))

    這篇文章主要給大家介紹了關(guān)于Java中4種校驗(yàn)注解詳解的相關(guān)資料,分別包括值校驗(yàn)、范圍校驗(yàn)、長度校驗(yàn)、格式校驗(yàn)等,Java注解(Annotation)是一種元數(shù)據(jù),它可以被添加到Java代碼中,并可以提供額外的信息和指令,需要的朋友可以參考下
    2023-08-08
  • Java語言----三種循環(huán)語句的區(qū)別介紹

    Java語言----三種循環(huán)語句的區(qū)別介紹

    下面小編就為大家?guī)硪黄狫ava語言----三種循環(huán)語句的區(qū)別介紹。小編舉得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-07-07
  • SpringBoot中HttpSessionListener的簡單使用方式

    SpringBoot中HttpSessionListener的簡單使用方式

    這篇文章主要介紹了SpringBoot中HttpSessionListener的簡單使用方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Springboot Redis設(shè)置key前綴的方法步驟

    Springboot Redis設(shè)置key前綴的方法步驟

    這篇文章主要介紹了Springboot Redis設(shè)置key前綴的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Spring源碼解析容器初始化構(gòu)造方法

    Spring源碼解析容器初始化構(gòu)造方法

    這篇文章主要介紹了Spring源碼解析容器初始化構(gòu)造方法,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-07-07
  • Mybatis SqlSessionFactory與SqlSession詳細(xì)講解

    Mybatis SqlSessionFactory與SqlSession詳細(xì)講解

    SqlSessionFactory是MyBatis的核心類之一,其最重要的功能就是提供創(chuàng)建MyBatis的核心接口SqlSession,所以我們需要先創(chuàng)建SqlSessionFactory,為此我們需要提供配置文件和相關(guān)的參數(shù)
    2022-11-11
  • Android中PreferenceFragment的使用詳解

    Android中PreferenceFragment的使用詳解

    本文主要介紹了Android中PreferenceFragment的使用詳解,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • SpringCloud Alibaba 基本開發(fā)框架搭建過程

    SpringCloud Alibaba 基本開發(fā)框架搭建過程

    這篇文章主要介紹了SpringCloud Alibaba 基本開發(fā)框架搭建過程,開發(fā)工具選用的idea,本文通過圖文實(shí)例相結(jié)合給大家分享搭建全過程,需要的朋友可以參考下
    2021-06-06
  • Java 跨域問題的處理方式

    Java 跨域問題的處理方式

    這篇文章主要介紹了Java 跨域問題的處理方式,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-11-11
  • jvm調(diào)優(yōu)常用命令行工具詳解

    jvm調(diào)優(yōu)常用命令行工具詳解

    這篇文章主要介紹了jvm調(diào)優(yōu)常用命令行工具的用法,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-03-03

最新評論

乐平市| 中超| 托克逊县| 新巴尔虎右旗| 吉木萨尔县| 汤原县| 临泉县| 临清市| 榆林市| 绵竹市| 阿图什市| 河西区| 沙田区| 井冈山市| 孟津县| 泰和县| 海阳市| 安溪县| 修文县| 保康县| 于都县| 鄱阳县| 昌黎县| 云安县| 嵊州市| 清丰县| 保德县| 永顺县| 南木林县| 阿城市| 吴旗县| 酉阳| 开远市| 綦江县| 壤塘县| 会理县| 静安区| 雅安市| 桃源县| 绥棱县| 城市|