qq交流羣:812321371
微信交流羣:MercyYao
在 java 項目裏經常使用到 mysql 多數據源操做。結合 springboot 使用原有的仍是很方便的。
不過須要配置多套數據源的配置。java
在微服務裏, 數據庫鏈接之類的配置是單獨拆開讀取。至關於一個模板。mysql
以下mysql:git
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等鏈接信息。github
固然 springboot
在注入多數據源時要讀取相應前綴的數據配置。redis
代碼:spring
@Bean @ConfigurationProperties(prefix = "spring.datasource.onemysql") public DataSource originalDataSource(DataSourceFactory dataSourceFactory) { return DataSourceBuilder.create().build(); }
配置:sql
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和配置文件。mongodb
根據上述方式, 咱們可使用一個mysql模板, 經過必定方式去加載建立對應的數據源。微服務下只須要維護一個mysql配置模板。數據庫
ps: 實際version版本請使用最新版
最新版本: springboot
<dependency> <groupId>com.purgeteam</groupId> <artifactId>mysql-datasource-spring-boot-starter</artifactId> <version>0.1.0.RELEASE</version> </dependency>
咱們先按照原有的方式配置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
爲數據庫名稱, 爲下面代碼注入作準備。
經過 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
數據庫數據源進行加載。
固然只有上面方式只適合數據庫地址密碼一致的狀況下,庫名不一致,注入多數據源。
下面方式支持數據庫信息不一致狀況下使用模板注入多數據源。
須要先配置 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); } }
@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