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

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

qq交流群: 812321371
微信交流群: MercyYao

簡介

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

在微服務(wù)里, 數(shù)據(jù)庫連接之類的配置是單獨拆開讀取各谚。相當(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 等等中間件連接配置通過單獨配置分開,以便后續(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ù)下只需要維護一個mysql配置模板等孵。

功能使用

添加依賴

ps: 實際version版本請使用最新版
最新版本:

點擊查看最新新版本

<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} 進行替換锐锣。

/**
 * 數(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ù)源進行加載。

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 方法進行創(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") 方式推薦使用抡诞。和之前的方法基本無差別, 簡單方便點穷蛹。

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

qq交流群: 812321371
微信交流群: MercyYao

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

作者GitHub:
Purgeyao 歡迎關(guān)注
本文由博客一文多發(fā)平臺 OpenWrite 發(fā)布!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末肴熏,一起剝皮案震驚了整個濱河市鬼雀,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蛙吏,老刑警劉巖源哩,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異鸦做,居然都是意外死亡励烦,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門馁龟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來崩侠,“玉大人漆魔,你說我怎么就攤上這事坷檩。” “怎么了改抡?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵矢炼,是天一觀的道長。 經(jīng)常有香客問我阿纤,道長句灌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任欠拾,我火速辦了婚禮胰锌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘藐窄。我一直安慰自己资昧,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布荆忍。 她就那樣靜靜地躺著格带,像睡著了一般。 火紅的嫁衣襯著肌膚如雪刹枉。 梳的紋絲不亂的頭發(fā)上叽唱,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天,我揣著相機與錄音微宝,去河邊找鬼棺亭。 笑死,一個胖子當(dāng)著我的面吹牛蟋软,可吹牛的內(nèi)容都是我干的镶摘。 我是一名探鬼主播专甩,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼钉稍!你這毒婦竟也來了涤躲?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤贡未,失蹤者是張志新(化名)和其女友劉穎种樱,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體俊卤,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡嫩挤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了消恍。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片岂昭。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖狠怨,靈堂內(nèi)的尸體忽然破棺而出约啊,到底是詐尸還是另有隱情,我是刑警寧澤佣赖,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布恰矩,位于F島的核電站,受9級特大地震影響憎蛤,放射性物質(zhì)發(fā)生泄漏外傅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一俩檬、第九天 我趴在偏房一處隱蔽的房頂上張望萎胰。 院中可真熱鬧,春花似錦棚辽、人聲如沸技竟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽灵奖。三九已至,卻和暖如春估盘,著一層夾襖步出監(jiān)牢的瞬間瓷患,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工遣妥, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留擅编,地道東北人。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像爱态,于是被迫代替她去往敵國和親谭贪。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容