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配置模板等孵。
功能使用
添加依賴
<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ā)布!