SpringBoot中怎么在運(yùn)行時(shí)動(dòng)態(tài)添加數(shù)據(jù)源-創(chuàng)新互聯(lián)

SpringBoot中怎么在運(yùn)行時(shí)動(dòng)態(tài)添加數(shù)據(jù)源,相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。

創(chuàng)新互聯(lián)服務(wù)項(xiàng)目包括長(zhǎng)葛網(wǎng)站建設(shè)、長(zhǎng)葛網(wǎng)站制作、長(zhǎng)葛網(wǎng)頁制作以及長(zhǎng)葛網(wǎng)絡(luò)營(yíng)銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,長(zhǎng)葛網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到長(zhǎng)葛省份的部分城市,未來相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

一、多數(shù)據(jù)源應(yīng)用場(chǎng)景:

1.配置文件配置多數(shù)據(jù)源,如默認(rèn)數(shù)據(jù)源:master,數(shù)據(jù)源1:salve1...,運(yùn)行時(shí)動(dòng)態(tài)切換已配置的數(shù)據(jù)源(master、salve1互相切換),無法在運(yùn)行時(shí)動(dòng)態(tài)添加配置文件中未配置的數(shù)據(jù)源。

2.配置一個(gè)默認(rèn)數(shù)據(jù)源,運(yùn)行時(shí)動(dòng)態(tài)添加新數(shù)據(jù)源使用(本博客適用于此場(chǎng)景)

二、解決方案:

Spring提供了AbstractRoutingDataSource用于動(dòng)態(tài)路由數(shù)據(jù)源,第一種場(chǎng)景繼承AbstractRoutingDataSource類并覆寫其protected abstract Object determineCurrentLookupKey()即可;

而第二種場(chǎng)景我們直接覆寫protected DataSource determineTargetDataSource方法即可。原理可看下AbstractRoutingDataSource對(duì)應(yīng)源碼,比較簡(jiǎn)單,不做贅述。

直接上干貨:

import com.fizz.utils.spring.SpringUtils;import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;import javax.sql.DataSource;public class DynamicDataSource extends AbstractRoutingDataSource {  private static final ThreadLocal<DataSource> dataSource = ThreadLocal.withInitial(() -> (DataSource) SpringUtils.getBean("defaultDataSource"));  public static void setDataSource(DataSource dataSource) {    DynamicDataSource.dataSource.set(dataSource);  }  public static DataSource getDataSource() {    return DynamicDataSource.dataSource.get();  }  @Override  protected Object determineCurrentLookupKey() {    return null;  }  @Override  protected DataSource determineTargetDataSource() {    return getDataSource();  }  public static void clear() {    DynamicDataSource.dataSource.remove();  }}

import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.Primary;import javax.sql.DataSource;import java.util.HashMap;@Configurationpublic class DataSourceConfig {  @Bean  @ConfigurationProperties("spring.datasource.druid")  public DataSource defaultDataSource() {    return DruidDataSourceBuilder.create().build();  }  @Bean  @Primary  public DynamicDataSource dataSource() {    DynamicDataSource dynamicDataSource = new DynamicDataSource();    dynamicDataSource.setTargetDataSources(new HashMap<>());    return dynamicDataSource;  }}

使用時(shí)直接調(diào)用DynamicDataSource.setDataSource(DataSource dataSource)方法即可,使用完后調(diào)用DynamicDataSource.clear()防止內(nèi)存泄漏并重置默認(rèn)數(shù)據(jù)源。

附上詳細(xì)使用方法:

DruidDataSource druidDataSource = new DruidDataSource();    druidDataSource.setUrl("jdbc:mysql://localhost:3306/sys?characterEncoding=utf-8&useSSL=false&serverTimezone=UTC&useAffectedRows=true");    druidDataSource.setUsername("root");    druidDataSource.setPassword("root");    DynamicDataSource.setDataSource(druidDataSource);    此時(shí)數(shù)據(jù)源已切換到druidDataSource ,調(diào)用自己的業(yè)務(wù)方法即可。    使用完后調(diào)用DynamicDataSource.clear();重置為默認(rèn)數(shù)據(jù)源。

附上工具類SpringUtils :

import lombok.Getter;import org.springframework.beans.BeansException;import org.springframework.context.ApplicationContext;import org.springframework.context.ApplicationContextAware;import org.springframework.stereotype.Component;@Componentpublic final class SpringUtils implements ApplicationContextAware {  @Getter  private static ApplicationContext applicationContext;  @Override  public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {    if (SpringUtils.applicationContext == null) {      SpringUtils.applicationContext = applicationContext;    }  }  public static <T> T getBean(Class<T> clazz) {    return SpringUtils.applicationContext.getBean(clazz);  }  public static Object getBean(String name) {    return SpringUtils.applicationContext.getBean(name);  }  public static String getProperty(String key) {    return SpringUtils.applicationContext.getEnvironment().getProperty(key);  }}

看完上述內(nèi)容,你們掌握SpringBoot中怎么在運(yùn)行時(shí)動(dòng)態(tài)添加數(shù)據(jù)源的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!

本文題目:SpringBoot中怎么在運(yùn)行時(shí)動(dòng)態(tài)添加數(shù)據(jù)源-創(chuàng)新互聯(lián)
文章URL:http://muchs.cn/article8/ceesop.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供標(biāo)簽優(yōu)化、微信公眾號(hào)、搜索引擎優(yōu)化定制網(wǎng)站、網(wǎng)站維護(hù)、軟件開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作