1. 程式人生 > >Spring Boot 動態切換資料來源三——動態獲取配置檔案中的配置資訊

Spring Boot 動態切換資料來源三——動態獲取配置檔案中的配置資訊

這裡是接上篇文章
Spring Boot 動態切換資料來源(負載均衡)

留下的問題,配置檔案中資料庫的資訊更改後代碼中能夠動態獲取。所以這裡重點說下優化後的內容。

先看配置檔案

slave:
  hosts: slave1,slave2
hikari:
  - master:
    jdbc-url: jdbc:mysql://master-host:3306/mydb?useUnicode=true&characterEncoding=utf8&useSSL=true&allowMultiQueries=true&verifyServerCertificate=false
username: root password: root maximum-pool-size: 10 pool-name: master connection-timeout: 30000 idle-timeout: 600000 max-lifetime: 1765000 data-source-properties: cachePrepStmts: true prepStmtCacheSize: 250 prepStmtCacheSqlLimit: 2048 useServerPrepStmts: true
useLocalSessionState: true useLocalTransactionState: true rewriteBatchedStatements: true cacheResultSetMetadata: true cacheServerConfiguration: true elideSetAutoCommits: true maintainTimeStats: false - slave1: jdbc-url: jdbc:mysql://slave1-host:3306/mydb?useUnicode=true&characterEncoding=utf8&useSSL=true&allowMultiQueries=true&verifyServerCertificate=false
username: root password: root maximum-pool-size: 10 pool-name: slave1 connection-timeout: 30000 idle-timeout: 600000 max-lifetime: 1765000 read-only: true - slave2: jdbc-url: jdbc:mysql://slave2-host:3306/mydb?useUnicode=true&characterEncoding=utf8&useSSL=true&allowMultiQueries=true&verifyServerCertificate=false username: root password: root maximum-pool-size: 10 pool-name: slave2 connection-timeout: 30000 idle-timeout: 600000 max-lifetime: 1765000 read-only: true

這裡的改動是master和slave前面加了“-”用來支援集合獲取這塊資訊。
另外pool-name改為了master和slave1、slave2,這個很重要,後邊有用到。因為獲取不到前邊的- master和-slave等資訊,所以這裡使用pool-name來確定是哪個資料來源。

DBProperties

import com.zaxxer.hikari.HikariDataSource;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.Map;
/**
 * @author Created by pangkunkun on 2017/12/18.
 */
@Component
@ConfigurationProperties(prefix = "")
public class DBProperties {
    //一次性從配置檔案中讀取所有資料來源的配置
    private Map<String, HikariDataSource> hikari;

    public Map<String, HikariDataSource> getHikari() {
        return hikari;
    }

    public void setHikari(Map<String, HikariDataSource> hikari) {
        this.hikari = hikari;
    }
}

這裡做了重點改動,原先是針對配置檔案中的欄位名來定義欄位的,這裡我直接用一個map來獲取配置檔案中配置的所有資料庫相關資訊。通過ConfigurationProperties來獲取配置檔案中集合這塊不屬於本文的講解,所以有需要的自己瞭解下。

DataSourceConfig

import com.zaxxer.hikari.HikariDataSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.transaction.PlatformTransactionManager;

import javax.annotation.Resource;
import javax.sql.DataSource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * @author Created by pangkunkun on 2018/8/28.
 */
@Configuration
public class DataSourceConfig {

    private static final Logger logger = LoggerFactory.getLogger(DataSourceConfig.class);

    @Autowired
    private DBProperties properties;

    private static final String KEY_MASTER = "master";

    @Bean(name = "dataSource")
    public DataSource dataSource() {
        //按照目標資料來源名稱和目標資料來源物件的對映存放在Map中
        Map<Object, Object> targetDataSources = new HashMap<>();
        //獲取配置檔案中的資料來源
        Map<String, HikariDataSource> hikaris = properties.getHikari();
        Set<String> keys = hikaris.keySet();
        HikariDataSource hikariDataSource = null;
        HikariDataSource masterDB = null;
        String poolName = "";
        for (String key : keys){
            hikariDataSource = hikaris.get(key);
            poolName = hikariDataSource.getPoolName();
            targetDataSources.put(hikariDataSource.getPoolName(),hikariDataSource);
            if (poolName.equals(KEY_MASTER)){
                masterDB = hikariDataSource;
            }
        }

        //採用是想AbstractRoutingDataSource的物件包裝多資料來源
        DynamicDataSource dataSource = new DynamicDataSource();
        dataSource.setTargetDataSources(targetDataSources);
        //設定預設的資料來源,當拿不到資料來源時,使用此配置
        if (null != masterDB){
            dataSource.setDefaultTargetDataSource(masterDB);
        }else {
            logger.error("Can't find master db, project will be exit");
            System.exit(0);
        }
        return dataSource;
    }

    @Bean
    public PlatformTransactionManager txManager() {
        return new DataSourceTransactionManager(dataSource());
    }
}

在上篇文章中這塊程式碼是將DBProperties中的幾個資料庫資訊一一放到map中,這裡通過DBProperties中的map獲取所有資料庫資訊放到資料來源的map中,通過poolname來區分資料庫的資訊。並且增加了master資料庫的判斷,如果識別不到master資料庫就會退出專案(這個功能看情況自己選擇是否需要)。

最後提一點,我打算最近抽時間把這塊做成一個公共元件,所有動態資訊通過配置檔案設定,以後就不用再動這塊程式碼了(希望自己能搞定吧^_^)。

相關推薦

Spring Boot 動態切換資料來源——動態獲取配置檔案配置資訊

這裡是接上篇文章 Spring Boot 動態切換資料來源(負載均衡) 留下的問題,配置檔案中資料庫的資訊更改後代碼中能夠動態獲取。所以這裡重點說下優化後的內容。 先看配置檔案 slave: hosts: slave1,slave2 hikari

Spring Boot Cache + redis 設定有效時間和自動重新整理快取,時間支援在配置檔案配置

分享一下我老師大神的人工智慧教程吧。零基礎,通俗易懂!風趣幽默!http://www.captainbed.net/ 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Spring Boot快取實戰 Redis 設定有效時間和自動重新整理快取,時間支援在配置檔案配置

問題描述 Spring Cache提供的@Cacheable註解不支援配置過期時間,還有快取的自動重新整理。 我們可以通過配置CacheManneg來配置預設的過期時間和針對每個快取容器(value)單獨配置過期時間,但是總是感覺不太靈活。下面是一個示例: @Bean

Spring Boot Admin 更換應用管理埠後在Environment配置引數

最近在使用Spring Boot Admin的時候發現一個問題,當修改了應用的管理埠後,在Environment功能中的引數編輯框就消失了:本人提供的解決辦法如下:@ManagementContextConfiguration public class ExceptionRe

Spring配置檔案配置資料庫連線(mysql,sqlserver,oracle)

xml配置檔案中配置如下: <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName"

Spring配置檔案配置property標籤的name和ref的區別:

在看李剛的《Java EE企業實戰》,裡面有一個關於Spring的配置的 <bean id=“person” class=“service.Person”> <!-- 控制器呼叫setAxe方法,將容器中的axe bean作為傳入的引數 --> <!–此處的na

使用FFMpeg 獲取MP3檔案資訊和圖片

我們在播放音訊檔案時,如MP3格式的音訊檔案,一些播放器會顯示音樂名稱、專輯名稱、歌手、音樂影象等資訊,如下圖片所示: 下面介紹使用FFMpeg來獲取這些資訊。 使用函式avformat_open_input開啟檔案,結封裝。 使用函式avformat_fi

Spring配置檔案配置事物

"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/contex

Spring進階之路(8)-java程式碼與配置檔案配置

實際開發中並不會需要你將程式碼轉為配置檔案的形式去呈現,但是,我寫著一系列博文的目的並不是教你如何去專案中進行開發,因為包括之前的幾篇博文中你會發現並不是在講專案的實踐的,我的想法是這樣的:為一些對Spring有所瞭解但是並不深入的朋友拓寬知識面,讓你不僅僅會用Spring

【十七】Spring Boot 之 多資料來源(擴充套件AbstractRoutingDataSource類,實現動態資料來源。使用AOP註解動態切換資料來源

在一個專案中操作多個不同的資料來源時,需要用到多資料來源的配置。 pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0

Spring Boot 動態切換資料來源二——負載均衡

如果僅僅是master-slave模式可以參考我前邊的文章Spring Boot HikariCP整合多資料來源。 這篇文章也是在那個基礎上修改的,上篇文章中的多資料來源是有限制的,哪條sql使用哪個資料庫必須在程式碼中寫死。現在針對這點做優化,真正的整合

在使用 Spring Boot 和 MyBatis 動態切換資料來源時遇到的問題以及解決方法

1. org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)在使用了動態資料來源後遇到了該問題,從錯誤資訊來看是因為沒有找到 *.xml 檔案而導致的,但是在配置檔案中 確實添加了相關的配置,這種錯誤的原因

springboot2之系統架構基礎()使用自定義註解動態切換資料來源

  yml配置 資料來源1 資料來源2 step1. 建立自定義註解 DataSource package com.hg.java.demo.common.annotions; import java.lang.annotation.ElementT

使用spring註解在方法或類上動態切換資料來源

1 相關知識 1.1  Spring的AbstractRoutingDataSource抽象類,該類可以充當資料來源的路由中介,可以根據名字動態切換資料來源 1.2  SpringAop 1.3  Spring自定義註解 2 思路 2.1 在類或方法上新增自定義註解,其值

Spring程式碼動態切換資料來源

最近專案中遇到一個場景,需要能夠在一個方法中操作多個具有相同表結構資料庫(你可以理解為一個表中的資料被水平拆分到多個庫中,查詢時需要遍歷這多個庫)。經過筆者幾天的研究,最終解決了問題,並且寫了一個demo共享到我的github。 關注筆者部落格的小夥伴一定知道之前的這篇文章

spring aop動態切換資料來源問題

最近專案需要用到多資料來源,使用aop切換了資料來源始終 還是原來的資料來源,後來感覺是事務引起的,就把 @Transactional註解去掉,就可以切換成功,到網上一查,原來是多資料來源要配置多個事務管理器,配了多個事務管理器後 再把  @Transactional 加上

Spring Boot 2.0(二):Spring Boot 2.0嘗鮮-動態 Banner

版本 手動 block OS 動態 posit 下載 網站 dep Spring Boot 2.0 提供了很多新特性,其中就有一個小彩蛋:動態 Banner,今天我們就先拿這個來嘗嘗鮮。 配置依賴 使用 Spring Boot 2.0 首先需要將項目依賴包替換為剛剛發布的

Spring Boot MyBatis升級篇-註解-動態SQL(if test)-方案二:@Provider(8)

指定 ins pro builder except uil test 就是 class 1)動態語言註解(2)@Provider使用思路(3)@SelectProvider小試牛刀(4)@SelectProvider初露鋒芒(5)@SelectProvider過關斬將(6)

springboot+mybatis多資料來源配置,AOP註解動態切換資料來源

轉載至:https://blog.csdn.net/xiaosheng_papa/article/details/80218006 親測有效。 注:有些系統中已經配置了單資料來源,現在要轉成多資料來源,可能需要額外的配置。拿我自己當前專案來說: 專案在啟動類中配置了單資料來源:

springboot+mybatis實現動態切換資料來源

前幾天有個需求,需要使用不同的資料來源,例如某業務要用A資料來源,另一個業務要用B資料來源。我上網收集了一些資料整合了一下,雖然最後這個需求不了了之了,但是多資料來源動態切換還是蠻好用的,所以記錄一下,或許以後有用呢?或者自己感興趣又想玩呢! 1.加個依賴 <dependency>