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

mybatis-plus動態(tài)數(shù)據源讀寫分離方式

 更新時間:2024年10月23日 09:00:58   作者:楊村你喜哥l  
在分布式項目開發(fā)中,動態(tài)數(shù)據源的配置與使用至關重要,通過創(chuàng)建DynamicDatasourceService,實現(xiàn)數(shù)據源的動態(tài)添加與調用,有效管理主從庫操作,減輕數(shù)據庫壓力,此外,通過配置類與@DS注解,實現(xiàn)了靈活的分庫查詢功能,為高效處理數(shù)據提供了強有力的支持

1、背景

在實際項目的開發(fā)過程中,一定會存在主庫與從庫的分布式模式,主庫進行增刪改,從庫進行查詢。

這樣可以保證對不同的數(shù)據庫進行操作,減少對數(shù)據庫的壓力。

2、動態(tài)數(shù)據源

創(chuàng)建DynamicDatasourceService

import com.jiuqi.grid.collection.entity.datasource.DataSourceDTO;
import java.util.Set;
public interface DynamicDatasourceService {


    /**
     * 獲取所有數(shù)據源
     *
     * @return
     */
    Set<String> datasources();


    /**
     * 添加數(shù)據源
     *
     * @param dto 數(shù)據源信息
     * @return
     */
    Set<String> add(DataSourceDTO dto);


    /**
     * 移除數(shù)據源
     *
     * @param name 連接池名稱
     */
    void remove(String name);
}

實現(xiàn)DynamicDatasourceService

package com.jiuqi.grid.collection.service.impl;

import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;
import com.baomidou.dynamic.datasource.creator.DefaultDataSourceCreator;
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DataSourceProperty;
import com.jiuqi.grid.collection.entity.datasource.DataSourceDTO;
import com.jiuqi.grid.collection.service.DynamicDatasourceService;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;

import javax.sql.DataSource;
import java.util.Set;

@Service
public class DynamicDatasourceServiceImpl implements DynamicDatasourceService {


    private final DataSource dataSource;

    private final DefaultDataSourceCreator dataSourceCreator;

    public DynamicDatasourceServiceImpl(
            DataSource dataSource, DefaultDataSourceCreator dataSourceCreator) {
        this.dataSource = dataSource;
        this.dataSourceCreator = dataSourceCreator;
    }


    /**
     * 獲取所有數(shù)據源
     *
     * @return
     */
    @Override
    public Set<String> datasources() {
        DynamicRoutingDataSource ds = (DynamicRoutingDataSource) dataSource;
        return ds.getDataSources().keySet();
    }


    /**
     * 添加數(shù)據源
     *
     * @param dto
     * @return
     */
    @Override
    public Set<String> add(DataSourceDTO dto) {
        DataSourceProperty dataSourceProperty = new DataSourceProperty();
        BeanUtils.copyProperties(dto, dataSourceProperty);
        DynamicRoutingDataSource ds = (DynamicRoutingDataSource) dataSource;
        DataSource dataSource = dataSourceCreator.createDataSource(dataSourceProperty);
        ds.addDataSource(dto.getPollName(), dataSource);
        return ds.getDataSources().keySet();
    }


    /**
     * 刪除數(shù)據源
     *
     * @param name
     */
    @Override
    public void remove(String name) {
        DynamicRoutingDataSource ds = (DynamicRoutingDataSource) dataSource;
        ds.removeDataSource(name);
    }

}

2.1添加數(shù)據源

我這里是讀取的配置文件里的用戶名、密碼等數(shù)據源的鏈接

 public void addDatasource(String tenant) {
        if (dynamicDatasourceService.datasources().contains(tenant)) {
            return;
        }
        DataSourceDTO datasourceDTO = new DataSourceDTO();
        //庫名
        datasourceDTO.setPollName(tenant);
        //鏈接信息 讀取配置文件的主庫信息
        datasourceDTO.setDriverClassName(sqlDataSource.getDriverClassName());
        //替換數(shù)據庫
        if (StringUtils.isEmpty(sqlDataSource.getUrl())) {
            throw new RuntimeException("配置文件讀取失敗");
        }
        String url = sqlDataSource.getUrl();
        url = url.replace("grid_test", tenant);
        datasourceDTO.setUrl(url);
        datasourceDTO.setUsername(sqlDataSource.getUsername());
        datasourceDTO.setPassword(sqlDataSource.getPassword());
        dynamicDatasourceService.add(datasourceDTO);
    }

2.2數(shù)據源

調用上面的addDatasource()方法,數(shù)據源就會創(chuàng)建成功,這里要注意的是,每一次增刪改查都需要調用此方法,以防數(shù)據源不存在。

3、分庫查詢

創(chuàng)建新的數(shù)據源目的就是為了可以進行分庫操作。

分庫操作步驟如下:

3.1添加配置類

package com.jiuqi.grid.collection.dsprocessor;

import com.baomidou.dynamic.datasource.processor.DsHeaderProcessor;
import com.baomidou.dynamic.datasource.processor.DsProcessor;
import com.baomidou.dynamic.datasource.processor.DsSessionProcessor;
import com.baomidou.dynamic.datasource.processor.DsSpelExpressionProcessor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 注冊動態(tài)數(shù)據源解析器
 */
@Configuration
public class MyDynamicDataSourceConfig {

  @Bean
  public DsProcessor dsProcessor() {
    DsMapProcessor mapProcessor = new DsMapProcessor();
    DsHeaderProcessor headerProcessor = new DsHeaderProcessor();
    DsSessionProcessor sessionProcessor = new DsSessionProcessor();
    DsSpelExpressionProcessor spelExpressionProcessor = new DsSpelExpressionProcessor();
    mapProcessor.setNextProcessor(headerProcessor);
    headerProcessor.setNextProcessor(sessionProcessor);
    sessionProcessor.setNextProcessor(spelExpressionProcessor);
    return mapProcessor;
  }
}
package com.jiuqi.grid.collection.dsprocessor;

import com.baomidou.dynamic.datasource.processor.DsProcessor;
import java.util.Map;
import com.jiuqi.grid.collection.consts.SQLConstants;
import com.jiuqi.grid.collection.dto.common.Address3DTO;
import com.jiuqi.grid.collection.dto.data.CollectionDataPageParam;
import com.jiuqi.grid.collection.entity.CollectionDataDO;
import org.aopalliance.intercept.MethodInvocation;

/**
 * 通過params map中獲取數(shù)據源標識
 *
 * @author songlude
 */
public class DsMapProcessor extends DsProcessor {

    /**
     * 抽象匹配條件 匹配才會走當前執(zhí)行器否則走下一級執(zhí)行器
     *
     * @param key DS注解里的內容
     * @return 是否匹配
     */
    @Override
    public boolean matches(String key) {
        return key.equals("#" + SQLConstants.EXEC_DATASOURCE);
    }

    /**
     * 抽象最終決定數(shù)據源
     *
     * @param invocation 方法執(zhí)行信息
     * @param key        DS注解里的內容
     * @return 數(shù)據源名稱
     */
    @Override
    public String doDetermineDatasource(MethodInvocation invocation, String key) {
        Object[] arguments = invocation.getArguments();
        Object argument = arguments[0];

        if (argument instanceof Map) {
            Map<String, Object> params = (Map<String, Object>) argument;
            Object value = params.get(SQLConstants.EXEC_DATASOURCE);
            return value == null ? null : value.toString();
        } else if (argument instanceof CollectionDataPageParam) {
            CollectionDataPageParam collectionDataPageParam = (CollectionDataPageParam) argument;
            return collectionDataPageParam.getGRID_DATASOURCE();
        } else if (argument instanceof CollectionDataDO) {
            CollectionDataDO collectionDataDO = (CollectionDataDO) argument;
            return collectionDataDO.getGRID_DATASOURCE();
        } else if (argument instanceof Address3DTO) {
            Address3DTO address3DTO = (Address3DTO) argument;
            return address3DTO.getGRID_DATASOURCE();
        }
        return null;
    }
}

這里要注意需要把“argument”進行類型的判斷,argument 就是你查詢Mapper的參數(shù),這里我獲取的是argument[0],則Mapper參數(shù)的位置在第一個。

3.2 添加數(shù)據源查詢

通過@DS注解來指定數(shù)據源,在配置類中指定了以#開頭

 @DS("#GRID_DATASOURCE")
    @UpdateProvider(type = QueryProvider.class, method = "createDatabase")
    void createDatabase(Map<String, Object> params);

這樣就可以開啟你的動態(tài)數(shù)據源,分庫查詢啦。

總結

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

相關文章

  • Java源碼解析之Gateway請求轉發(fā)

    Java源碼解析之Gateway請求轉發(fā)

    今天給大家?guī)淼氖顷P于Java的相關知識,文章圍繞著Gateway請求轉發(fā)展開,文中有非常詳細介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • Java基礎之重載(Overload)與重寫(Override)詳解

    Java基礎之重載(Overload)與重寫(Override)詳解

    這篇文章主要介紹了Java基礎之重載(Overload)與重寫(Override)詳解,文中有非常詳細的代碼示例,對正在學習java基礎的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • Java中操作Redis的詳細方法

    Java中操作Redis的詳細方法

    基于Jedis實現(xiàn)對redis中字符串的操作,文中通過實例代碼給大家介紹的非常詳細,包括連接池JedisPool應用的實例代碼,對Java操作Redis的相關知識感興趣的朋友一起看看吧
    2021-11-11
  • 全面解析Hibernate關聯(lián)操作、查詢操作、高級特性、并發(fā)處理機制

    全面解析Hibernate關聯(lián)操作、查詢操作、高級特性、并發(fā)處理機制

    這篇文章主要介紹了全面解析Hibernate關聯(lián)操作、查詢操作、高級特性、并發(fā)處理機制的相關資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-06-06
  • JAVA實現(xiàn)LRU算法的參考示例

    JAVA實現(xiàn)LRU算法的參考示例

    這篇文章主要介紹了JAVA實現(xiàn)LRU算法的參考示例,幫助大家根據需求實現(xiàn)算法,感興趣的朋友可以了解下
    2020-10-10
  • 簡單易懂的MyBatis分庫分表方案分享

    簡單易懂的MyBatis分庫分表方案分享

    這篇文章主要給大家介紹了關于MyBatis分庫分表方案的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者使用MyBatis具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-03-03
  • Java13 明天發(fā)布(最新最全新特性解讀)

    Java13 明天發(fā)布(最新最全新特性解讀)

    這篇文章主要介紹了Java13 明天發(fā)布,最新最全新特性解讀,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-09-09
  • SpringCloud Gateway動態(tài)轉發(fā)后端服務實現(xiàn)過程講解

    SpringCloud Gateway動態(tài)轉發(fā)后端服務實現(xiàn)過程講解

    這篇文章主要介紹了SpringCloud Gateway動態(tài)轉發(fā)后端服務實現(xiàn)過程,簡單的路由轉發(fā)可以通過SpringCloudGateway的配置文件實現(xiàn),在一些業(yè)務場景種,會需要動態(tài)替換路由配置中的后端服務地址,單純靠配置文件無法滿足這種需求
    2023-03-03
  • Spring Boot webflux使用方法解析

    Spring Boot webflux使用方法解析

    這篇文章主要介紹了Spring Boot webflux使用方法解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-03-03
  • Nebula?Graph介紹和SpringBoot環(huán)境連接和查詢操作

    Nebula?Graph介紹和SpringBoot環(huán)境連接和查詢操作

    Nebula?Graph?是一款開源的、分布式的、易擴展的原生圖數(shù)據庫,能夠承載包含數(shù)千億個點和數(shù)萬億條邊的超大規(guī)模數(shù)據集,并且提供毫秒級查詢,這篇文章主要介紹了Nebula?Graph介紹和SpringBoot環(huán)境連接和查詢,需要的朋友可以參考下
    2022-10-10

最新評論

滨州市| 六盘水市| 安陆市| 东台市| 桦川县| 曲沃县| 彭阳县| 安化县| 仪征市| 通渭县| 西畴县| 新宁县| 石楼县| 张家港市| 鄱阳县| 黎平县| 洮南市| 钦州市| 神池县| 岱山县| 亳州市| 青川县| 顺平县| 内乡县| 博兴县| 紫金县| 铜梁县| 泸溪县| 闽清县| 盘山县| 龙胜| 新竹市| 和林格尔县| 双流县| 江口县| 长沙县| 慈溪市| 宁晋县| 小金县| 彩票| 揭东县|