溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

SpringBoot-Mysql模板多數(shù)據(jù)源加載的方法

發(fā)布時間:2021-06-24 10:40:24 來源:億速云 閱讀:140 作者:chen 欄目:大數(shù)據(jù)

本篇內(nèi)容介紹了“SpringBoot-Mysql模板多數(shù)據(jù)源加載的方法”的有關(guān)知識,在實(shí)際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

SpringBoot-Mysql模板多數(shù)據(jù)源加載

簡介

在 java 項目里常用到 mysql 多數(shù)據(jù)源操作。結(jié)合 springboot 使用原有的還是很方便的。 不過需要配置多套數(shù)據(jù)源的配置。

在微服務(wù)里, 數(shù)據(jù)庫連接之類的配置是單獨(dú)拆開讀取。相當(dāng)于一個模板。

如下mysql:

spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/${config.mysql.name}?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&autoReconnect=true
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driverClassName=com.mysql.jdbc.Driver

redis rabbitmq mongodb 等等中間件連接配置通過單獨(dú)配置分開,以便后續(xù)方便修改ip等連接信息。

當(dāng)然 springboot 在注入多數(shù)據(jù)源時要讀取相應(yīng)前綴的數(shù)據(jù)配置。

代碼:

@Bean
@ConfigurationProperties(prefix = "spring.datasource.onemysql")
public DataSource originalDataSource(DataSourceFactory dataSourceFactory) {
    return DataSourceBuilder.create().build();
}

配置:

spring.datasource.onemysql.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.onemysql.url=jdbc:mysql://127.0.0.1:3306/${config.mysql.name}?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&autoReconnect=true
spring.datasource.onemysql.username=root
spring.datasource.onemysql.password=root
spring.datasource.onemysql.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.onemysql.driverClassName=com.mysql.jdbc.Driver

上面方式加載以 onemysql 開始的數(shù)據(jù)源配置。如果是多個的話,相應(yīng)配置多個bean和配置文件。

根據(jù)上述方式, 我們可以使用一個mysql模板, 通過一定方式去加載創(chuàng)建對應(yīng)的數(shù)據(jù)源。微服務(wù)下只需要維護(hù)一個mysql配置模板。

功能使用

添加依賴

ps: 實(shí)際version版本請使用最新版 

點(diǎn)擊查看最新新版本

<dependency>
  <groupId>com.purgeteam</groupId>
  <artifactId>mysql-datasource-spring-boot-starter</artifactId>
  <version>0.1.0.RELEASE</version>
</dependency>

1 配置模板

我們先按照原有的方式配置mysql數(shù)據(jù)源配置。

config.mysql.name=user
config.mysql.hosturl=127.0.0.1:3306

# mysql
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://${config.mysql.hosturl}/${config.mysql.name}?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&autoReconnect=true
spring.datasource.jdbc-url=${spring.datasource.url}
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.filters=stat
spring.datasource.maxActive=20
spring.datasource.initialSize=1
spring.datasource.maxWait=60000
spring.datasource.minIdle=1
spring.datasource.timeBetweenEvictionRunsMillis=60000
spring.datasource.minEvictableIdleTimeMillis=300000
spring.datasource.validationQuery=select 'x'
spring.datasource.testWhileIdle=true
spring.datasource.testOnBorrow=false
spring.datasource.testOnReturn=false
spring.datasource.poolPreparedStatements=true
spring.datasource.maxOpenPreparedStatements=20

config.mysql.name 為數(shù)據(jù)庫名稱, 為下面代碼注入做準(zhǔn)備。

2 數(shù)據(jù)庫名結(jié)合模板配置

通過 DataSourceFactory#createDataSource 方法可以將指定數(shù)據(jù)庫注入。模板配置為之前的配置, 數(shù)據(jù)庫名稱通過 ${config.mysql.name} 進(jìn)行替換。

/**
 * 數(shù)據(jù)庫名稱替換方式生成 {@link DataSource}
 * @author purgeyao
 * @since 1.0
 */
@Configuration
public class OneDataSourceConfiguration {

    ...

    /**
     * DataSourceFactory#createDataSource 方式加載 one_mysql 數(shù)據(jù)庫
     * @param dataSourceFactory dataSourceFactory
     * @return {@link DataSource}
     */
    @Primary
    @Bean
    public DataSource oneDataSource(DataSourceFactory dataSourceFactory) {
        return dataSourceFactory.createDataSource("one_mysql");
    }

}

這樣可以把名為 one_mysql 數(shù)據(jù)庫數(shù)據(jù)源進(jìn)行加載。

2 數(shù)據(jù)庫信息結(jié)合配置模板

當(dāng)然只有上面方式只適合數(shù)據(jù)庫地址密碼一致的情況下,庫名不一致,注入多數(shù)據(jù)源。

下面方式支持?jǐn)?shù)據(jù)庫信息不一致情況下使用模板注入多數(shù)據(jù)源。

需要先配置 mysql (1 配置模板),另行加下下面配置。

配置:

config.datasource.mysql.source-info-map 包含 4 個信息 host-url數(shù)據(jù)庫地址 、 name數(shù)據(jù)庫名稱、username數(shù)據(jù)庫用戶名、 password數(shù)據(jù)庫密碼。

config.datasource.mysql.source-info-map.tow_mysql 里的 tow_mysql 為 map 集合的 key。

# mysql-datasource-spring-boot-starter
config.datasource.mysql.source-info-map.tow_mysql.host-url=127.0.0.1:3306
config.datasource.mysql.source-info-map.tow_mysql.name=tow_mysql
config.datasource.mysql.source-info-map.tow_mysql.username=root
config.datasource.mysql.source-info-map.tow_mysql.password=root

代碼:

先在 DataSourceConfigProperties 對象里獲取相應(yīng) SourceInfoMap 配置。

DataSourceConfigProperties.SourceInfo towMysq 配置通過 DataSourceFactory#createDataSource 方法進(jìn)行創(chuàng)建即可。

/**
 * {@link DataSourceConfigProperties} 配置方式生成 {@link DataSource}
 *
 * @author purgeyao
 * @since 1.0
 */
@Configuration
public class TowDataSourceConfiguration {

    /**
     * DataSourceFactory#createDataSource 方式加載 tow_mysql 數(shù)據(jù)庫
     *
     * @param dataSourceFactory dataSourceFactory
     * @return {@link DataSource}
     */
    @Bean
    public DataSource towDataSource(DataSourceFactory dataSourceFactory, DataSourceConfigProperties properties) {
        DataSourceConfigProperties.SourceInfo towMysql = properties.getSourceInfoMap().get("tow_mysql");
        if (towMysql == null) {
            throw new IllegalArgumentException("未獲取到相應(yīng)配置");
        }
        return dataSourceFactory.createDataSource(towMysql);
    }

}

4 注解選擇器結(jié)合模板配置(推薦寫法)

@DataSourceSelector 注解可以使用配置模板生成相應(yīng)數(shù)據(jù)源對象。

DataSourceSelector#value 為數(shù)據(jù)庫配置key(詳情2的配置), 其他寫法和原有的數(shù)據(jù)庫創(chuàng)建方法一致。

只是把原有的 @ConfigurationProperties(prefix = "spring.datasource.onemysql") 替換為 @DataSourceSelector("tow_mysql")

/**
 * 注解方式注入 {@link DataSource}
 *
 * @author purgeyao
 * @since 1.0
 */
@Configuration
public class AnnotationsDataSourceConfiguration {

    ...

    /**
     * {@link DataSourceSelector} 方式選擇注入 {@link DataSource}
     *
     * @return {@link DataSource}
     */
    @DataSourceSelector("tow_mysql")
    public DataSource selectorDataSource() {
        return DataSourceBuilder.create().build();
    }
}

總結(jié)

@DataSourceSelector("tow_mysql") 方式推薦使用。和之前的方法基本無差別, 簡單方便點(diǎn)。

mysql 配置文件分開之后方便之后多個服務(wù)使用。

“SpringBoot-Mysql模板多數(shù)據(jù)源加載的方法”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI