亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時(shí)間:2021年07月22日 09:29:47   作者:夢(mèng)想畫家  
本文介紹如何使用 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ù)源,該信息我們稱為上下文??梢允腥魏螌?duì)象,下面示例我們使用枚舉 ClientDatabase 作為上下文:

public enum ClientDatabase {
    CLIENT_A, CLIENT_B
}

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

上下文持有者 ( ContextHolder )

上下文持有者實(shí)現(xiàn)是存儲(chǔ)當(dāng)前上下文的容器,如 ThreadLocal 對(duì)象。除了包括上下文引用外,還應(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對(duì)象,用于配置 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ù)源,但典型場(chǎng)景時(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中提供synchronized后為什么還要提供Lock

    Java中提供synchronized后為什么還要提供Lock

    這篇文章主要介紹了Java中提供synchronized后為什么還要提供Lock,在Java中提供了synchronized關(guān)鍵字來(lái)保證只有一個(gè)線程能夠訪問同步代碼塊,下文更多相關(guān)資料需要的小伙伴可以參考一下
    2022-03-03
  • Java使用Jdom讀取xml解析實(shí)例

    Java使用Jdom讀取xml解析實(shí)例

    這篇文章主要介紹了Java使用Jdom讀取xml解析,以實(shí)例形式較為詳細(xì)的分析了Jdom操作XML文件實(shí)現(xiàn)讀取操作的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-10-10
  • Go并發(fā)編程中使用channel的方法

    Go并發(fā)編程中使用channel的方法

    本文給大家介紹Go并發(fā)編程中使用channel的方法,通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2021-11-11
  • SpringBoot應(yīng)用啟動(dòng)內(nèi)置Tomcat的過程源碼分析

    SpringBoot應(yīng)用啟動(dòng)內(nèi)置Tomcat的過程源碼分析

    這篇文章主要介紹了SpringBoot應(yīng)用啟動(dòng)內(nèi)置Tomcat的過程分析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-07-07
  • 一個(gè)簡(jiǎn)單的Spring容器初始化流程詳解

    一個(gè)簡(jiǎn)單的Spring容器初始化流程詳解

    這篇文章主要給大家介紹了一個(gè)簡(jiǎn)單的Spring容器初始化流程的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • 詳解SpringBoot?Start組件開發(fā)之記錄接口日志信息

    詳解SpringBoot?Start組件開發(fā)之記錄接口日志信息

    這篇文章主要為大家介紹了SpringBoot-Start組件開發(fā)之記錄接口日志信息詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • 簡(jiǎn)單了解Spring中常用工具類

    簡(jiǎn)單了解Spring中常用工具類

    這篇文章主要介紹了簡(jiǎn)單了解Spring中常用工具類,非常全面,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-10-10
  • Java中Lambda表達(dá)式的使用詳細(xì)教程

    Java中Lambda表達(dá)式的使用詳細(xì)教程

    這篇文章將通過示例為大家詳細(xì)展示Java中Lambda表達(dá)式的用法,同時(shí)也會(huì)介紹Lambda的相關(guān)知識(shí),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-05-05
  • Java設(shè)計(jì)模式之java備忘錄模式詳解

    Java設(shè)計(jì)模式之java備忘錄模式詳解

    這篇文章主要介紹了JAVA設(shè)計(jì)模式之備忘錄模式,簡(jiǎn)單說明了備忘錄模式的概念、原理并結(jié)合實(shí)例形式分析了java備忘錄模式的具體定義及使用方法,需要的朋友可以參考下
    2021-09-09
  • java.lang.OutOfMemoryError: Metaspace異常解決的方法

    java.lang.OutOfMemoryError: Metaspace異常解決的方法

    這篇文章主要介紹了java.lang.OutOfMemoryError: Metaspace異常解決的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03

最新評(píng)論