實戰指南,SpringBoot + Mybatis 如何對接多數據源

系列文章目錄

MyBatis緩存原理
Mybatis plugin 的使用及原理
MyBatis+Springboot 啟動到SQL執行全流程
數據庫操作不再困難,MyBatis動態Sql標簽解析
從零開始,手把手教你搭建Spring Boot后臺工程并說明
Spring框架與SpringBoot的關聯與區別
Spring監聽器用法與原理詳解
Spring事務暢談 —— 由淺入深徹底弄懂 @Transactional注解



在這里插入圖片描述
在我們開發一些具有綜合功能的項目時,往往會碰到一種情況,需要同時連接多個數據庫,這個時候就需要用到多數據源的設計。而Spring 與 Myabtis 其實做了多數據源的適配,只需少許改動即可對接多數據源。本期我們就貼近實戰,以一個單數據源的Demo為例,講述將其改為多數據源項目的過程,希望大家能有所體會

📕作者簡介:戰斧,從事金融IT行業,有著多年一線開發、架構經驗;愛好廣泛,樂于分享,致力于創作更多高質量內容
📗本文收錄于 Spring全家桶 專欄,有需要者,可直接訂閱專欄實時獲取更新
📘高質量專欄 云原生、RabbitMQ、Spring全家桶 等仍在更新,歡迎指導
📙Zookeeper Redis kafka docker netty等諸多框架,以及架構與分布式專題即將上線,敬請期待


一、數據源的定義

數據源(Data Source)是指數據存儲的地方,大多數情況是指數據庫,不過文件服務器、傳感器、API等也能算數據源,主要是提供了對數據的訪問和操作。數據源中存儲了所有建立數據庫連接的信息。就像通過指定文件名稱可以在文件系統中找到文件一樣,通過提供正確的數據源名稱,你可以找到相應的數據庫連接
在這里插入圖片描述

二、單數據源配置

因為SpringBoot對數據源有著高度的默認配置,只配置一個數據源時,該數據源會被作為默認,所以對接單數據源其實是非常簡單的。如果你的工程采用的yaml格式配置文件,我們僅需做如下配置:

spring:#數據庫連接配置datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/springtestusername: rootpassword: root

如果是采用properties配置文件的也是一樣的:

spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/springtest
spring.datasource.username=root
spring.datasource.password=root

三、如何配置多數據源

1. 工程層級調整

我們以曾經搭建的工程為原始模板,進行對接多數據源的操作。沒看過的可以點此查看: 從零開始,手把手教你搭建Spring Boot后臺工程并說明
在這里插入圖片描述
因為僅變動數據源,所以我們不改動其他層級,僅僅將 mapper 拆為 mapper1mapper2 兩部分
在這里插入圖片描述

2. Spring項目配置

然后我們需要在 application.properties 或者 application.yml 中定義多個數據源:

spring:#數據庫連接配置datasource1:driver-class-name: com.mysql.cj.jdbc.Driverjdbc-url: jdbc:mysql://127.0.0.1:3306/springtest2username: rootpassword: rootdatasource2:driver-class-name: com.mysql.cj.jdbc.Driverjdbc-url: jdbc:mysql://127.0.0.1:3306/springtestusername: rootpassword: root

這里有兩個細節需要注意:

  1. 因為我們決定使用雙數據源,所以把數據源的連接配置改成了datasource1datasource2。而不再保留datasource,這樣SpringBoot就不再會為我們設定默認數據庫
  2. 因為我們目前采用的 springBoot2.5.2,默認的連接池為Hikari,該連接池數據源的地址字段為jdbc-url 而非 url。在只有單個數據源時,SpringBoot走默認數據源邏輯為我們把 urljdbc-url 進行映射,保證我們獲得數據源。此時我們自己設置的數據源沒有進行映射處理,就需要保證字段符合Hikari的要求。否則會出現 java.lang.IllegalArgumentException: jdbcUrl is required with driverClassName 異常

3. 會話配置

僅有配置文件可不行,接下來,我們需要在代碼中讀取到配置,并建立兩個數據源。如下,每個數據源都有隔離的mapper接口、xml文件、會話工廠及會話模板

第一個數據源 如下(示例):

@Configuration
@MapperScan(basePackages = "com.zhanfu.springboot.demo.mapper1", sqlSessionFactoryRef = "sqlSessionFactory1")
public class DataSource1Config {@Bean@ConfigurationProperties(prefix = "spring.datasource1")public DataSource dataSource1() {return DataSourceBuilder.create().build();}@Beanpublic SqlSessionFactory sqlSessionFactory1() throws Exception {SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();sessionFactoryBean.setDataSource(dataSource1());String locationPattern = "classpath*:/mapper1/*.xml";PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();sessionFactoryBean.setMapperLocations(resolver.getResources(locationPattern));return sessionFactoryBean.getObject();}@Bean(name = "sqlSessionTemplate1")public SqlSessionTemplate sqlSessionTemplate1(@Qualifier("sqlSessionFactory1") SqlSessionFactory sqlSessionFactory) {return new SqlSessionTemplate(sqlSessionFactory);}
}

配置第二個數據源 DataSource2Config

@Configuration
@MapperScan(basePackages = "com.zhanfu.springboot.demo.mapper2", sqlSessionFactoryRef = "sqlSessionFactory2")
public class DataSource2Config {@Bean@ConfigurationProperties(prefix = "spring.datasource2")public DataSource dataSource2() {return DataSourceBuilder.create().build();}@Beanpublic SqlSessionFactory sqlSessionFactory2() throws Exception {SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();sessionFactoryBean.setDataSource(dataSource2());String locationPattern = "classpath*:/mapper2/*.xml";PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();sessionFactoryBean.setMapperLocations(resolver.getResources(locationPattern));return sessionFactoryBean.getObject();}@Bean(name = "sqlSessionTemplate2")public SqlSessionTemplate sqlSessionTemplate2(@Qualifier("sqlSessionFactory2") SqlSessionFactory sqlSessionFactory) {return new SqlSessionTemplate(sqlSessionFactory);}@Bean(name = "productMapper")public ProductMapper mapper2(@Qualifier("sqlSessionTemplate2") SqlSessionTemplate sqlSessionTemplate) throws Exception {return sqlSessionTemplate.getMapper(ProductMapper.class);}
}

4. 事務管理器

為兩個數據源分別配置自己的事務管理器,如果你的項目里通篇沒有方法級別的事務(一個SQL就是一個事務),那不設置這個也不影響,否則還是建議加上。

@Configuration
public class TransactionManagerConfig {@Autowiredprivate DataSource dataSource1;@Autowiredprivate DataSource dataSource2;@Beanpublic PlatformTransactionManager txManager1() {return new DataSourceTransactionManager(dataSource1);}@Beanpublic PlatformTransactionManager txManager2() {return new DataSourceTransactionManager(dataSource2);}
}

四、驗證

我們把兩張表拆進兩個庫中,以兩個庫模擬兩個數據源,使得程序可以同時連接兩個庫
在這里插入圖片描述
瀏覽器輸入 http://127.0.0.1:8080/user/findall 查詢接口成功
在這里插入圖片描述
再在瀏覽器輸入 http://127.0.0.1:8080/product/findall 查詢第二個庫的數據亦成功返回
在這里插入圖片描述
這樣我們就完成了一個工程同時連接兩個數據源。


總結

經過上述的操作,我們已經成功把項目對接了多數據源。當然,方案肯定不止這一種,后續圍繞該問題,我們還會講解其他方式。但不論是什么方式,主旨都是加深大家對SpringBoot 和 Mybatis的理解,我們曾經梳理過全流程,但只是蜻蜓點水帶大家看一遍大體輪廓,并不足以讓你精通,后面本專欄將繼續深入講解

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/38721.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/38721.shtml
英文地址,請注明出處:http://en.pswp.cn/news/38721.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

輕松解決docker容器啟動閃退

docker run -p 3306:3306 --name mysql8 \ -v /usr/local/mysql/log:/var/log/mysql \ -v /usr/local/mysql/data:/var/lib/mysql \ -v /usr/local/mysql/conf:/etc/mysql \ -e MYSQL_ROOT_PASSWORD666 -d mysql:8.0.32執行這個命令的時候閃退,其實這個是命令是對你…

[cv] stable diffusion——2、公式

背景: 在圖像生成領域中,最常見的生成模型是GAN和VAE。然而,在2020年,提出了一種新的模型,即DDPM(Denoising Diffusion Probabilistic Model),也被稱為擴散模型(Diffusi…

基于eBPF技術構建一種應用層網絡管控解決方案

引言 隨著網絡應用的不斷發展,在linux系統中對應用層網絡管控的需求也日益增加,而傳統的iptables、firewalld等工具難以針對應用層進行網絡管控。因此需要一種創新的解決方案來提升網絡應用的可管理性。 本文將探討如何使用eBPF技術構建一種應用層網絡…

【CSS】禁用元素鼠標事件(例如實現元素禁用效果)

文章目錄 基本用法 基本用法 pointer-events 屬性指定在什么情況下 (如果有) 某個特定的圖形元素可以成為鼠標事件。實際運用中可以通過對auto 和none動態控制,來動態實現元素的禁用效果。 屬性描述auto與pointer-events屬性未指定時的表現效果相同,對…

【筆試題心得】排序算法總結整理

排序算法匯總 常用十大排序算法_calm_G的博客-CSDN博客 以下動圖參考 十大經典排序算法 Python 版實現(附動圖演示) - 知乎 冒泡排序 排序過程如下圖所示: 比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。對每一對相鄰…

【LeetCode-簡單】劍指 Offer 29. 順時針打印矩陣(詳解)

題目 輸入一個矩陣,按照從外向里以順時針的順序依次打印出每一個數字。 示例 1: 輸入:matrix [[1,2,3],[4,5,6],[7,8,9]] 輸出:[1,2,3,6,9,8,7,4,5]示例 2: 輸入:matrix [[1,2,3,4],[5,6,7,8],[9,10,1…

互聯網發展歷程:速度與效率,交換機的登場

互聯網的演進就像一場追求速度與效率的競賽,每一次的技術升級都為我們帶來更快、更高效的網絡體驗。然而,在網絡的初期階段,人們面臨著數據傳輸速度不夠快的問題。一項關鍵的技術應運而生,那就是“交換機”。 速度不足的困境&…

CloudEvents—云原生事件規范

我們的系統中或多或少都會用到如下兩類業務技術: 異步任務,用于降低接口時延或削峰,提升用戶體驗,降低系統并發壓力;通知類RPC,用于微服務間狀態變更,用戶行為的聯動等場景; 以上兩種…

Go和Java實現解釋器模式

Go和Java實現解釋器模式 下面通過一個四則運算來說明解釋器模式的使用。 1、解釋器模式 解釋器模式提供了評估語言的語法或表達式的方式,它屬于行為型模式。這種模式實現了一個表達式接口,該接口 解釋一個特定的上下文。這種模式被用在 SQL 解析、符…

規劃性和可擴展性,助力企業全面預算管理的推進

對于當今社會經濟市場的不穩定狀況和不斷變化的消費者行為,企業業務也從未像今天這樣不可預測過。面對變化和變革,企業需要具備規劃性的預測能力,才能使得自身在競爭中保持領先地位。那些具備前瞻性的企業都嘗試在現階段通過更好的規劃不斷提…

基于Mysqlrouter+MHA+keepalived實現高可用半同步 MySQL Cluster項目

目錄 項目名稱: 基于Mysqlrouter MHA keepalived實現半同步主從復制MySQL Cluster MySQL Cluster: 項目架構圖: 項目環境: 項目環境安裝包: 項目描述: 項目IP地址規劃: 項目步驟: 一…

windows11下配置vscode中c/c++環境

本文默認已經下載且安裝好vscode,主要是解決環境變量配置以及編譯task、launch文件的問題。 自己嘗試過許多博客,最后還是通過這種方法配置成功了。 Linux(ubuntu 20.04)配置vscode可以直接跳轉到配置task、launch文件,不需要下載mingw與配…

寬度有限搜索BFS搜索數及B3625 迷宮尋路 P1451 求細胞數量 B3626 跳躍機器人

寬度有限搜索BFS搜索 B3625 迷宮尋路 題面 題目描述 機器貓被困在一個矩形迷宮里。 迷宮可以視為一個 nm 矩陣,每個位置要么是空地,要么是墻。機器貓只能從一個空地走到其上、下、左、右的空地。 機器貓初始時位于 (1,1) 的位置,問能否…

localhost:8080 is already in use

報錯原因:本機的8080端口號已經被占用。因為機器的空閑端口號是隨機分配的,而idea默認啟動的端口號是8080,所以是存在這種情況。 對于這個問題,我們只需要重啟idea或者修改項目的啟動端口號即可。 更推薦第二種。對于修改項目啟動端口號&…

Python 程序設計入門(020)—— 循環結構程序設計(1):for 循環

Python 程序設計入門(020)—— 循環結構程序設計(1):for 循環 目錄 Python 程序設計入門(020)—— 循環結構程序設計(1):for 循環一、for 循環的語法二、for …

ZDH-wemock模塊

本次介紹基于版本v5.1.1 目錄 項目源碼 預覽地址 安裝包下載地址 wemock模塊 wemock模塊前端 配置首頁 配置mock wemock服務 下載地址 打包 運行 效果展示 項目源碼 zdh_web: https://github.com/zhaoyachao/zdh_web zdh_mock: https://github.com/zhaoyachao/z…

TCGA數據下載推薦:R語言easyTCGA包

#使用easyTCGA獲取數據 #清空 rm(listls()) gc() # 安裝bioconductor上面的R包 options(BioC_mirror"https://mirrors.tuna.tsinghua.edu.cn/bioconductor") if(!require("BiocManager")) install.packages("BiocManager") if(!require("TC…

怎樣讓音頻速度變慢?請跟隨以下方法進行操作

怎樣讓音頻速度變慢?在會議錄音過程中,經常會遇到主講人語速過快,導致我們無法清晰聽到對方說的內容。如果我們能夠減慢音頻速度,就能更好地記錄對方的講話內容。此外,在聽到快速播放的外語或方言時,我們也…

LA@2@1@線性方程組和簡單矩陣方程有解判定定理

文章目錄 矩陣方程有解判定定理線性方程組有解判定特化:齊次線性方程組有解判定推廣:矩陣方程 A X B AXB AXB有解判定證明推論 矩陣方程有解判定定理 線性方程組有解判定 線性方程組 A x b A\bold{x}\bold{b} Axb有解的充分必要條件是它的系數矩陣A和增廣矩陣 ( A , b ) (A,…

機器人的運動范圍

聲明 該系列文章僅僅展示個人的解題思路和分析過程,并非一定是優質題解,重要的是通過分析和解決問題能讓我們逐漸熟練和成長,從新手到大佬離不開一個磨練的過程,加油! 原題鏈接 機器人的運動范圍https://leetcode.c…