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

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

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

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

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

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

public enum ClientDatabase {
    CLIENT_A, CLIENT_B
}

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

上下文持有者 ( ContextHolder )

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

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

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 獲得當前 上下文。AbstractRoutingDataSource 幫我們處理了其他邏輯,僅了解它透明地返回了合適的數(shù)據(jù)源:

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

配置

下面利用Map上下文存儲DataSource對象,用于配置 AbstractRoutingDataSource 。當然也可以指定缺省數(shù)據(jù)源,當沒有設定上下文時選擇缺省數(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ù)源,但典型場景時運行時創(chuàng)建,或使用JNDI方式查找。下面定義示例的Dao類,它依賴動態(tài)數(shù)據(jù)源進行實例化:

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");
    };
}

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

實際使用時,首先設置上下文,然后再執(zhí)行業(yè)務操作。我們定義業(yè)務層,其中業(yè)務方法包括上下文作為參數(shù)。在執(zhí)行業(yè)務之前設置上下文,調(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;
    }
}

總結

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

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

相關文章

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

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

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

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

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

    SpringBoot中HttpSessionListener的簡單使用方式

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

    Springboot Redis設置key前綴的方法步驟

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

    Spring源碼解析容器初始化構造方法

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

    Mybatis SqlSessionFactory與SqlSession詳細講解

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

    Android中PreferenceFragment的使用詳解

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

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

    這篇文章主要介紹了SpringCloud Alibaba 基本開發(fā)框架搭建過程,開發(fā)工具選用的idea,本文通過圖文實例相結合給大家分享搭建全過程,需要的朋友可以參考下
    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)常用命令行工具的用法,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-03-03

最新評論

邹平县| 乌拉特前旗| 若羌县| 龙川县| 环江| 和田县| 临洮县| 康马县| 平武县| 北碚区| 拉萨市| 保靖县| 乳山市| 江城| 海安县| 天等县| 长丰县| 澄迈县| 淳化县| 阳江市| 五华县| 旬阳县| 泌阳县| 米林县| 沁阳市| 常州市| 休宁县| 辽源市| 庆阳市| 雅江县| 多伦县| 额敏县| 衡南县| 惠来县| 衡阳县| 津南区| 万载县| 凌海市| 海盐县| 昭通市| 本溪市|