SpringBoot-Mysql模板多數據源加載

SpringBoot-Mysql模板多數據源加載

qq交流羣: 812321371java

微信交流羣: MercyYaomysql

簡介

在 java 項目裏經常使用到 mysql 多數據源操做。結合 springboot 使用原有的仍是很方便的。不過須要配置多套數據源的配置。git

在微服務裏, 數據庫鏈接之類的配置是單獨拆開讀取。至關於一個模板。github

以下mysql:redis

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 等等中間件鏈接配置經過單獨配置分開,以便後續方便修改ip等鏈接信息。spring

固然 springboot 在注入多數據源時要讀取相應前綴的數據配置。sql

代碼:mongodb

@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 開始的數據源配置。若是是多個的話,相應配置多個bean和配置文件。springboot

根據上述方式, 咱們可使用一個mysql模板, 經過必定方式去加載建立對應的數據源。微服務下只須要維護一個mysql配置模板。

功能使用

添加依賴

ps: 實際version版本請使用最新版最新版本: ![Maven Central](https://search.maven.org/search?q=g:com.purgeteam%20AND%20a:mysql-datasource-spring-boot-starter)

點擊查看最新新版本

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

1 配置模板

咱們先按照原有的方式配置mysql數據源配置。

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 爲數據庫名稱, 爲下面代碼注入作準備。

2 數據庫名結合模板配置

經過 DataSourceFactory#createDataSource 方法能夠將指定數據庫注入。模板配置爲以前的配置, 數據庫名稱經過 ${config.mysql.name} 進行替換。

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

    ...

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

}複製代碼

這樣能夠把名爲 one_mysql 數據庫數據源進行加載。

2 數據庫信息結合配置模板

固然只有上面方式只適合數據庫地址密碼一致的狀況下,庫名不一致,注入多數據源。

下面方式支持數據庫信息不一致狀況下使用模板注入多數據源。

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

配置:

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

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 對象裏獲取相應 SourceInfoMap 配置。

DataSourceConfigProperties.SourceInfo towMysq 配置經過 DataSourceFactory#createDataSource 方法進行建立便可。

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

    /**
     * DataSourceFactory#createDataSource 方式加載 tow_mysql 數據庫
     *
     * @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("未獲取到相應配置");
        }
        return dataSourceFactory.createDataSource(towMysql);
    }

}複製代碼

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

@DataSourceSelector 註解可使用配置模板生成相應數據源對象。

DataSourceSelector#value 爲數據庫配置key(詳情2的配置), 其餘寫法和原有的數據庫建立方法一致。

只是把原有的 @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();
    }
}複製代碼

總結

@DataSourceSelector("tow_mysql") 方式推薦使用。和以前的方法基本無差異, 簡單方便點。

mysql 配置文件分開以後方便以後多個服務使用。

qq交流羣: 812321371

微信交流羣: MercyYao

示例代碼地址:data-source-spring-boot

做者GitHub:
Purgeyao 歡迎關注

本文由博客一文多發平臺 OpenWrite 發佈!

相關文章
相關標籤/搜索