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>