国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Java】Spring Boot配置動態(tài)數(shù)據(jù)源

這篇具有很好參考價值的文章主要介紹了【Java】Spring Boot配置動態(tài)數(shù)據(jù)源。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

SpringBoot配置動態(tài)數(shù)據(jù)源

一、動態(tài)多數(shù)據(jù)源的配置

1.1 創(chuàng)建動態(tài)數(shù)據(jù)源

通過實現(xiàn)Spring提供的AbstractRoutingDataSource類,可以實現(xiàn)自己的數(shù)據(jù)源選擇邏輯,從而可以實現(xiàn)數(shù)據(jù)源的動態(tài)切換。

public class DynamicDataSource extends AbstractRoutingDataSource {

    @Value("${spring.datasource.default-db-key}")
    private String defaultDbKey;·

    @Override
    protected Object determineCurrentLookupKey() {
        String currentDb = DynamicDataSourceService.currentDb();
        if (currentDb == null) {
            return defaultDbKey;
        }
        return currentDb;
    }
}

1.2 創(chuàng)建動態(tài)數(shù)據(jù)源配置類

跟配置靜態(tài)多數(shù)據(jù)源一樣,需要手動配置下面的三個 Bean,只不過DynamicDataSource類的targetDataSources是空的。

@Configuration
public class DynamicDataSourceConfig {
    /**
     * 動態(tài)數(shù)據(jù)源
     */
    @Bean
    public DynamicDataSource dynamicDataSource() {
        DynamicDataSource dataSource = new DynamicDataSource();
        Map<Object, Object> targetDataSources = new HashMap<>();
        dataSource.setTargetDataSources(targetDataSources);
        return dataSource;
    }

    /**
     * 會話工廠
     */
    @Bean
    public SqlSessionFactoryBean sqlSessionFactoryBean() throws IOException {
        org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
        configuration.setMapUnderscoreToCamelCase(true);
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dynamicDataSource());
        sqlSessionFactoryBean.setConfiguration(configuration);
        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        sqlSessionFactoryBean.setMapperLocations(resolver.getResources("classpath*:/repository/*.xml"));
        return sqlSessionFactoryBean;
    }

    /**
     * 事務(wù)管理器
     */
    @Bean
    public PlatformTransactionManager transactionManager() {
        return new DataSourceTransactionManager(dynamicDataSource());
    }
    
}

1.3 創(chuàng)建動態(tài)數(shù)據(jù)源服務(wù)類

這是一個比較核心的工具類,提供了一些靜態(tài)方法從而可以實現(xiàn)一些功能,包括:
動態(tài)添加數(shù)據(jù)源、切換數(shù)據(jù)源重置數(shù)據(jù)源、獲取數(shù)據(jù)源
在 DynamicDataSource 類中,就是調(diào)用了 DynamicDataSourceService 類的 switchDb
方法實現(xiàn)的數(shù)據(jù)源選擇。
通過查看下面的代碼就能看出來使用線程本地的技術(shù)實現(xiàn)的多個請求數(shù)據(jù)源互不相干。

@Slf4j
public class DynamicDataSourceService {
    private static final Map<Object, Object> dataSources = new HashMap<>();
    private static final ThreadLocal<String> dbKeys = ThreadLocal.withInitial(() -> null);

    /**
     * 動態(tài)添加一個數(shù)據(jù)源
     *
     * @param name       數(shù)據(jù)源的key
     * @param dataSource 數(shù)據(jù)源對象
     */
    public static void addDataSource(String name, DataSource dataSource) {
        DynamicDataSource dynamicDataSource = App.context.getBean(DynamicDataSource.class);
        dataSources.put(name, dataSource);
        dynamicDataSource.setTargetDataSources(dataSources);
        dynamicDataSource.afterPropertiesSet();

        log.info("addDataSource 添加了數(shù)據(jù)源:{}", name);
    }

    /**
     * 切換數(shù)據(jù)源
     */
    public static void switchDb(String dbKey) {
        dbKeys.set(dbKey);
        log.info("switchDb 切換數(shù)據(jù)源:{}", dbKey);
    }

    /**
     * 重置數(shù)據(jù)源
     */
    public static void resetDb() {
        dbKeys.remove();
        log.info("resetDb 重置數(shù)據(jù)源");
    }

    /**
     * 獲取當前數(shù)據(jù)源
     */
    public static String currentDb() {
    	log.info("currentDb 獲取當前數(shù)據(jù)源");
        return dbKeys.get();
    }
}

至此,動態(tài)多數(shù)據(jù)源的配置就完成了,只需要編寫數(shù)據(jù)源生成的邏輯,在程序運行時調(diào)用 addDataSource 方法即可將數(shù)據(jù)源動態(tài)添加到上下文中,并支持動態(tài)切換。

下面簡單介紹一下基于配置文件的數(shù)據(jù)源生成。

二、數(shù)據(jù)源生成器

2.1 自定義了一個數(shù)據(jù)源生成器接口用于定義動態(tài)生成數(shù)據(jù)源的要求。

public interface DataSourceProvider {
    List<DataSource> provide();
}

2.2 然后編寫了一個根據(jù)配置文件提供數(shù)據(jù)源并配置的實現(xiàn)類。

@Component
@ConfigurationProperties(prefix = "spring.datasource.hikari")
public class YmlDataSourceProvider implements DataSourceProvider {

    private List<Map<String, DataSourceProperties>> dataSources;

    private DataSource buildDataSource(DataSourceProperties prop) {
        DataSourceBuilder<?> builder = DataSourceBuilder.create();
        builder.driverClassName(prop.getDriverClassName());
        builder.username(prop.getUsername());
        builder.password(prop.getPassword());
        builder.url(prop.getJdbcUrl());
        return builder.build();
    }

    @Override
    public List<DataSource> provide() {
        List<DataSource> res = new ArrayList<>();
        dataSources.forEach(map -> {
            Set<String> keys = map.keySet();
            keys.forEach(key -> {
                DataSourceProperties properties = map.get(key);
                DataSource dataSource = buildDataSource(properties);
                DynamicDataSourceService.addDataSource(key, dataSource);
            });
        });
        return res;
    }

    @PostConstruct
    public void init() {
        provide();
    }

    public List<Map<String, DataSourceProperties>> getDataSources() {
        return dataSources;
    }

    public void setDataSources(List<Map<String, DataSourceProperties>> dataSources) {
        this.dataSources = dataSources;
    }
}

看一下對應的配置文件內(nèi)容:

spring:
  datasource:
    default-db-key: db0
    hikari:
      data-sources:
        - db0:
            jdbc-url: jdbc:mysql://127.0.0.1:3306/codingcea
            username: codingce
            password: 1234567890
            driver-class-name: com.mysql.cj.jdbc.Driver
        - db1:
            jdbc-url: jdbc:mysql://127.0.0.1:3306/codingceb
            username: codingce
            password: 1234567890
            driver-class-name: com.mysql.cj.jdbc.Driver

這樣就實現(xiàn)了應用啟動時自動將配置文件中的數(shù)據(jù)源配置讀取并生成數(shù)據(jù)源注冊到上下文中;
當然也可以有其他的實現(xiàn),比如從數(shù)據(jù)庫讀取并配置,或者通過接口請求的方式生成都可以,只要實現(xiàn)自己的DataSourceProvider就可以。文章來源地址http://www.zghlxwxcb.cn/news/detail-702902.html

到了這里,關(guān)于【Java】Spring Boot配置動態(tài)數(shù)據(jù)源的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Spring Boot整合Mybatis配置多數(shù)據(jù)源

    在之前的事件管理系統(tǒng)博客中有提到動態(tài)的多數(shù)據(jù)源配置 工作中難免需要做幾個工具方便自己偷懶,加上之前的擋板,數(shù)據(jù)源肯定沒法單一配置,所以需要多數(shù)據(jù)源配置。這里介紹兩種配置:動態(tài)數(shù)據(jù)源和固定數(shù)據(jù)源模式。這兩種我在目前的工作的工具開發(fā)中都有用到。 M

    2024年01月23日
    瀏覽(29)
  • 如何在Spring Boot中配置雙數(shù)據(jù)源?

    在許多應用程序中, 可能會遇到需要連接多個數(shù)據(jù)庫的情況 。這些數(shù)據(jù)庫可以是不同的類型,例如關(guān)系型數(shù)據(jù)庫和NoSQL數(shù)據(jù)庫,或者它們可以是相同類型但包含不同的數(shù)據(jù)。為了處理這種情況,我們可以使用雙數(shù)據(jù)源來管理多個數(shù)據(jù)庫連接。 雙數(shù)據(jù)源是指在一個應用程序中

    2024年02月11日
    瀏覽(20)
  • springboot整合多數(shù)據(jù)源的配置以及動態(tài)切換數(shù)據(jù)源,注解切換數(shù)據(jù)源

    springboot整合多數(shù)據(jù)源的配置以及動態(tài)切換數(shù)據(jù)源,注解切換數(shù)據(jù)源

    在許多應用程序中,可能需要使用多個數(shù)據(jù)庫或數(shù)據(jù)源來處理不同的業(yè)務(wù)需求。Spring Boot提供了簡便的方式來配置和使用多數(shù)據(jù)源,使開發(fā)人員能夠輕松處理多個數(shù)據(jù)庫連接。如果你的項目中可能需要隨時切換數(shù)據(jù)源的話,那我這篇文章可能能幫助到你 ??:這里對于pom文件

    2024年02月10日
    瀏覽(32)
  • SpringBoot從數(shù)據(jù)庫讀取數(shù)據(jù)數(shù)據(jù)源配置信息,動態(tài)切換數(shù)據(jù)源

    SpringBoot從數(shù)據(jù)庫讀取數(shù)據(jù)數(shù)據(jù)源配置信息,動態(tài)切換數(shù)據(jù)源

    ? ? ? ? 首先準備多個數(shù)據(jù)庫,主庫smiling-datasource,其它庫test1、test2、test3 ? ? ? ? 接下來,我們在主庫smiling-datasource中,創(chuàng)建表databasesource,用于存儲多數(shù)據(jù)源相關(guān)信息。表結(jié)構(gòu)設(shè)計如下 ? ? ? ? 創(chuàng)建好表之后,向表databasesource中存儲test1、test2、test3三個數(shù)據(jù)庫的相關(guān)配置

    2024年01月16日
    瀏覽(36)
  • Spring Boot MyBatis Plus 配置數(shù)據(jù)源詳解

    Spring Boot MyBatis Plus 配置數(shù)據(jù)源詳解

    ??歡迎來到架構(gòu)設(shè)計專欄~Spring Boot MyBatis Plus 配置數(shù)據(jù)源詳解 ☆* o(≧▽≦)o *☆嗨~我是IT·陳寒?? ?博客主頁:IT·陳寒的博客 ??該系列文章專欄:架構(gòu)設(shè)計 ??其他專欄:Java學習路線 Java面試技巧 Java實戰(zhàn)項目 AIGC人工智能 數(shù)據(jù)結(jié)構(gòu)學習 ??文章作者技術(shù)和水平有限,如果文

    2024年01月21日
    瀏覽(30)
  • Spring Boot + MyBatis-Plus 實現(xiàn) MySQL 主從復制動態(tài)數(shù)據(jù)源切換

    Spring Boot + MyBatis-Plus 實現(xiàn) MySQL 主從復制動態(tài)數(shù)據(jù)源切換

    MySQL 主從復制是一種常見的數(shù)據(jù)庫架構(gòu),它可以提高數(shù)據(jù)庫的性能和可用性。 動態(tài)數(shù)據(jù)源切換則可以根據(jù)業(yè)務(wù)需求,在不同場景下使用不同的數(shù)據(jù)源,比如在讀多寫少的場景下,可以通過切換到從庫來分擔主庫的壓力 。 在本文中,我們將介紹如何在 Spring Boot 中實現(xiàn) MySQL 動

    2024年02月19日
    瀏覽(27)
  • Spring Boot多數(shù)據(jù)源配置詳解及報錯問題解決

    Spring Boot多數(shù)據(jù)源配置詳解及報錯問題解決

    Spring Boot多數(shù)據(jù)源配置詳解 前幾天,公司提了個需求,對一個項目進行二次開發(fā),在開發(fā)過程中,需要配置多數(shù)據(jù)源來進行數(shù)據(jù)庫的操作。下面我將主鍵探索總結(jié)的配置流程和遇到的各種坑做以總結(jié),希望能夠幫到遇到同樣問題的友友。有錯的地方,請各位大佬留言指出。

    2024年02月16日
    瀏覽(21)
  • spring boot下基于spring data jpa配置mysql+達夢多數(shù)據(jù)源(以不同包路徑方式,mysql為主數(shù)據(jù)源)

    :mysql 達夢/dameng jpa 多數(shù)據(jù)源 spring boot:2.1.17.RELEASE mysql驅(qū)動:8.0.21(跟隨boot版本) 達夢驅(qū)動:8.1.2.192 lombok:1.18.12(跟隨boot版本) 以mysql為主數(shù)據(jù)源,達夢為第二數(shù)據(jù)源方式配置 適用于舊項目二次開發(fā)接入達夢數(shù)據(jù)庫或基于通用二方/三方包做業(yè)務(wù)擴展等場景 將以不

    2024年02月05日
    瀏覽(58)
  • 使用mybatis和dynamic-datasource-spring-boot-starter動態(tài)切換數(shù)據(jù)源操作數(shù)據(jù)庫

    記錄 :415 場景 :使用mybatis和dynamic-datasource-spring-boot-starter動態(tài)切換數(shù)據(jù)源操作數(shù)據(jù)庫。 版本 :JDK 1.8,Spring?Boot 2.6.3,dynamic-datasource-spring-boot-starter-3.3.2,mybatis-3.5.9。 源碼 :https://github.com/baomidou/dynamic-datasource-spring-boot-starter dynamic-datasource-spring-boot-starter :一個基于springboot的快

    2023年04月19日
    瀏覽(22)
  • 分享一個優(yōu)秀的動態(tài)數(shù)據(jù)源開源庫-dynamic-datasource-spring-boot-starter

    分享一個優(yōu)秀的動態(tài)數(shù)據(jù)源開源庫-dynamic-datasource-spring-boot-starter

    在我們的Java后端研發(fā)工作中, 有時候由于業(yè)務(wù)的快速迭代和數(shù)據(jù)的安全隔離性,往往會為不同的 API業(yè)務(wù)線分配不同的數(shù)據(jù)庫,即一個微服務(wù)經(jīng)常需要和多個數(shù)據(jù)源打交道。 dynamic-datasource-spring-boot-starter 是一個基于springboot的快速集成多數(shù)據(jù)源的啟動器。 其支持 Jdk 1.7+, Spring

    2024年02月12日
    瀏覽(18)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包