SpringBoot中配置多數(shù)據(jù)源的方法詳解
開始配置多數(shù)據(jù)源
首先我們需要先移除自動(dòng)配置數(shù)據(jù)源,SpringBoot 的默認(rèn)行為
DataSourceAutoConfiguration 是 SpringBoot 提供的自動(dòng)配置類
@SpringBootApplication(scanBasePackages = "com", exclude = {DataSourceAutoConfiguration.class})
下面首先讀取了默認(rèn)數(shù)據(jù)源的信息,通過 getProperties() 封裝成一個(gè) Map 對(duì)象
定義了一個(gè)名為 dynamicDataSource 的 bean 是數(shù)據(jù)源路由器,它繼承了 AbstractRoutingDataSource 類,我們可以根據(jù)規(guī)則選擇要使用的數(shù)據(jù)源。
dataSource 方法接受一個(gè) Map,并返回一個(gè)數(shù)據(jù)源,于是我們就創(chuàng)建了一個(gè)數(shù)據(jù)源
這段代碼通過設(shè)置,配置了一個(gè)支持動(dòng)態(tài)切換的數(shù)據(jù)源,默認(rèn)使用 master,用于運(yùn)行時(shí)動(dòng)態(tài)切換數(shù)據(jù)源。
@Configuration
@Slf4j
public class DataSourceConfigurer {
@Value("${spring.datasource.druid.master.url}")
private String url;
@Value("${spring.datasource.druid.master.username}")
private String username;
@Value("${spring.datasource.druid.master.password}")
private String password;
@Value("${spring.datasource.driverClassName}")
private String driverClassName;
/**
* 獲取數(shù)據(jù)源配置信息
*
* @return 數(shù)據(jù)源配置信息
*/
private Map<String, Object> getProperties() {
Map<String, Object> map = new HashMap<>();
map.put("driverClassName", driverClassName);
map.put("url", url);
map.put("username", username);
map.put("password", password);
return map;
}
/**
* 配置動(dòng)態(tài)數(shù)據(jù)源
*
* @return 動(dòng)態(tài)數(shù)據(jù)源
*/
@Bean("dynamicDataSource")
public DynamicRoutingDataSource dynamicDataSource() {
DynamicRoutingDataSource dynamicRoutingDataSource = new DynamicRoutingDataSource();
// 創(chuàng)建數(shù)據(jù)源
DataSource dataSource = dynamicRoutingDataSource.dataSource(getProperties());
// 設(shè)置數(shù)據(jù)源映射
Map<Object, Object> dataSourceMap = new HashMap<>(1);
dataSourceMap.put("default_db", dataSource);
dynamicRoutingDataSource.setTargetDataSources(dataSourceMap);
// 設(shè)置默認(rèn)數(shù)據(jù)源
dynamicRoutingDataSource.setDefaultTargetDataSource(dataSource);
return dynamicRoutingDataSource;
}
}
具體切換多數(shù)據(jù)源的邏輯 DynamicRoutingDataSource
多數(shù)據(jù)源切換的實(shí)現(xiàn)的關(guān)鍵是 AbstractRoutingDataSource
我們這里創(chuàng)建了一個(gè) targetTargetDataSources 是一個(gè) Map 存儲(chǔ)數(shù)據(jù)源的數(shù)據(jù),key 數(shù)據(jù)源的標(biāo)識(shí),value 是具體的數(shù)據(jù)源。通過 setTargetDataSources 可以設(shè)置數(shù)據(jù)源,在運(yùn)行時(shí),通過該方法切換。
通過 addDataSource 添加數(shù)據(jù)源,并通過 setTargetDataSources 使數(shù)據(jù)源生效。
existDataSource 是判斷數(shù)據(jù)源是否存在
dataSource 這個(gè)是重要的方法,它是為數(shù)據(jù)源在druid 連接池中創(chuàng)建了資源,配置了數(shù)據(jù)源。
/**
* 動(dòng)態(tài)數(shù)據(jù)源
*/
@Slf4j
public class DynamicRoutingDataSource extends AbstractRoutingDataSource {
private static Map<Object, Object> targetTargetDataSources = new ConcurrentHashMap<>();
@Override
protected Object determineCurrentLookupKey() {
// 每次連接數(shù)據(jù)庫,都會(huì)去設(shè)置數(shù)據(jù)源
return DynamicDataSourceContextHolder.getDataSourceKey();
}
// 設(shè)置targetDataSources并記錄數(shù)據(jù)源(這里可以記錄每個(gè)數(shù)據(jù)源的最近使用時(shí)間,可以做刪除不經(jīng)常使用的數(shù)據(jù)源)
@Override
public void setTargetDataSources(Map<Object, Object> targetDataSources) {
super.setTargetDataSources(targetDataSources);
super.afterPropertiesSet();
targetTargetDataSources = targetDataSources;
}
// 添加數(shù)據(jù)源
public void addDataSource(String tenant, Map<String, Object> dataSourceProperties) {
targetTargetDataSources.put(tenant, dataSource(dataSourceProperties));
super.setTargetDataSources(targetTargetDataSources);
afterPropertiesSet();
}
// 判斷是否存在數(shù)據(jù)源,存在直接取
public boolean existDataSource(String tenant) {
return targetTargetDataSources.containsKey(tenant);
}
// 組裝數(shù)據(jù)源
public DataSource dataSource(Map<String, Object> dataSourceProperties) {
DataSource dataSource;
try {
dataSource = DruidDataSourceFactory.createDataSource(dataSourceProperties);
} catch (Exception e) {
log.error("dataSource: {}", e.getMessage());
throw new RuntimeException();
}
return dataSource;
}
}
到此這篇關(guān)于SpringBoot中配置多數(shù)據(jù)源的方法詳解的文章就介紹到這了,更多相關(guān)SpringBoot配置多數(shù)據(jù)源內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot項(xiàng)目中多數(shù)據(jù)源配置方法與使用場(chǎng)景
- SpringBoot進(jìn)行多數(shù)據(jù)源配置的詳細(xì)步驟
- SpringBoot多數(shù)據(jù)源配置完整指南
- Mybatis+Druid+MybatisPlus多數(shù)據(jù)源配置方法
- Mybatis-plus配置多數(shù)據(jù)源,連接多數(shù)據(jù)庫方式
- springboot配置多數(shù)據(jù)源(靜態(tài)和動(dòng)態(tài)數(shù)據(jù)源)
- SpringBoot+mybatis-plus實(shí)現(xiàn)多數(shù)據(jù)源配置的詳細(xì)步驟
相關(guān)文章
mybatis創(chuàng)建一個(gè)或多個(gè)新用戶 insert 字段和表名不確定時(shí)動(dòng)態(tài)添加問題
這篇文章主要介紹了mybatis創(chuàng)建一個(gè)或多個(gè)新用戶 insert 字段和表名不確定時(shí)動(dòng)態(tài)添加問題,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-02-02
Java mutable對(duì)象和immutable對(duì)象的區(qū)別說明
這篇文章主要介紹了Java mutable對(duì)象和immutable對(duì)象的區(qū)別,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
java之super關(guān)鍵字用法實(shí)例解析
這篇文章主要介紹了java之super關(guān)鍵字用法實(shí)例解析,較為詳細(xì)的分析了super關(guān)鍵字的用法及內(nèi)存分布,需要的朋友可以參考下2014-09-09
Java中使用Hutool進(jìn)行AES加密解密的方法舉例
AES是一種對(duì)稱加密,所謂對(duì)稱加密就是加密與解密使用的秘鑰是一個(gè),下面這篇文章主要介紹了Java中使用Hutool進(jìn)行AES加密解密的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-04-04
springboot實(shí)現(xiàn)定時(shí)器(一看即會(huì),非常簡(jiǎn)單)
這篇文章主要介紹了springboot實(shí)現(xiàn)定時(shí)器(一看即會(huì),非常簡(jiǎn)單),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12
基于Java實(shí)現(xiàn)QQ登錄注冊(cè)功能的示例代碼
這篇文章主要和大家分享如何利用Java語言實(shí)現(xiàn)QQ登錄、注冊(cè)等功能。本文主要應(yīng)用的技術(shù)有:GUI、JDBC、多線程等,需要的可以參考一下2022-05-05
基于Java解決華為機(jī)試實(shí)現(xiàn)密碼截取?
這篇文章主要介紹了基于Java解決華為機(jī)試實(shí)現(xiàn)密碼截取,文章圍繞主題相關(guān)資料展開詳細(xì)內(nèi)容,具有一的參考價(jià)值,需要的小伙伴可以參考一下,希望對(duì)你有所幫助2022-02-02

