Hutool DsFactory多數據源切換

一、簡單上手:從配置到使用全流程

DsFactory 的核心優勢是零侵入配置,支持多種配置方式,不管是 properties 文件還是代碼里直接定義,都能快速初始化數據源。先引依賴(Maven):

<dependency><groupId>cn.hutool</groupId><artifactId>hutool-db</artifactId><version>5.8.20</version>
</dependency>
<!-- 數據庫驅動根據需要添加,比如MySQL -->
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</version>
</dependency>
  1. 配置文件方式:最推薦的做法在resources目錄下創建db.setting文件,配置數據源信息:

在resources目錄下創建db.setting文件,配置數據源信息:

# 默認數據源(必填)
[default]
url = jdbc:mysql://localhost:3306/db1
username = root
password=123456
driver = com.mysql.cj.jdbc.Driver# 第二個數據源(名稱自定義)
[second]
url = jdbc:mysql://localhost:3306/db2
username = root
password=123456
driver = com.mysql.cj.jdbc.Driver# 連接池配置(可選,全局生效)
[pool]
maxActive = 50
maxIdle = 10
minIdle = 5
initialSize = 5

然后一行代碼獲取數據源:

// 獲取默認數據源
DataSource defaultDs = DsFactory.get();// 獲取指定名稱的數據源
DataSource secondDs = DsFactory.get("second");
  1. 代碼配置方式:動態添加數據源

不需要配置文件時,直接在代碼里定義:

// 創建數據源配置
DbConfig defaultConfig = new DbConfig();
defaultConfig.setUrl("jdbc:mysql://localhost:3306/db1");
defaultConfig.setUsername("root");
defaultConfig.setPassword("123456");// 添加到DsFactory
DsFactory.register("default", defaultConfig);// 再添加一個數據源
DbConfig otherConfig = new DbConfig();
otherConfig.setUrl("jdbc:mysql://localhost:3306/db3");
otherConfig.setUsername("root");
otherConfig.setPassword("123456");
DsFactory.register("other", otherConfig);// 使用時直接獲取
DataSource defaultDs = DsFactory.get("default");
DataSource otherDs = DsFactory.get("other");
  1. 支持的數據庫類型:不止關系型數據庫

除了 MySQL、Oracle 這些關系型數據庫,還支持 SQLite、H2 等嵌入式數據庫:

# SQLite數據源配置
[sqlite]
url = jdbc:sqlite:test.db
driver = org.sqlite.JDBC
# SQLite不需要用戶名密碼

甚至可以配置 Redis(雖然 Redis 不是數據庫,但 DsFactory 也能管理):

[redis]
type = redis
host = localhost
port = 6379
password = 

二、核心功能:數據源管理就該這么簡單

  1. 切換數據源:一行代碼搞定

需要操作不同數據庫時,直接通過名稱獲取即可:

// 操作默認數據庫
Db.use(DsFactory.get()).query("select * from user");// 切換到second數據源
Db.use(DsFactory.get("second")).execute("insert into log values(...)");

在業務代碼中切換更是方便:

public class UserService {public List<User> getUsersFromDb1() {// 使用默認數據源return Db.use(DsFactory.get()).query(Entity.create("user"), User.class);}public List<User> getUsersFromDb2() {// 切換到第二個數據源return Db.use(DsFactory.get("second")).query(Entity.create("user"), User.class);}
}
  1. 連接池配置:全局統一管理

在db.setting的[pool]節點配置連接池參數,所有數據源都會生效:

[pool]
maxActive = 100  # 最大活躍連接數
maxIdle = 20     # 最大空閑連接數
minIdle = 5      # 最小空閑連接數
initialSize = 10 # 初始連接數
maxWait = 3000   # 獲取連接的最大等待時間(毫秒)

如果某個數據源需要特殊配置,可以單獨指定:

# 單獨給second數據源配置連接池
[second]
url = jdbc:mysql://localhost:3306/db2
username = root
password = 123456
driver = com.mysql.cj.jdbc.Driver
maxActive = 80  # 覆蓋全局配置
maxIdle = 15
  1. 動態增減數據源:運行時也能改

支持在程序運行中添加或移除數據源,適合動態切換場景:

// 動態添加一個臨時數據源
DbConfig tempConfig = new DbConfig();
tempConfig.setUrl("jdbc:mysql://localhost:3306/temp_db");
tempConfig.setUsername("root");
tempConfig.setPassword("123456");
DsFactory.register("temp", tempConfig);// 使用臨時數據源
Db.use(DsFactory.get("temp")).execute("create table temp_table(id int)");// 用完移除
DsFactory.unregister("temp");

三、實戰場景

  1. 讀寫分離:查詢走從庫,寫入走主庫

配置主庫和從庫兩個數據源,業務代碼中按需切換:

# db.setting配置
[master]
url = jdbc:mysql://master:3306/db
username = root
password = 123456[slave]
url = jdbc:mysql://slave:3306/db
username = root
password = 123456

業務代碼:

public class OrderService {// 寫入操作走主庫public void createOrder(Order order) {Db.use(DsFactory.get("master")).insert(Entity.parse(order));}// 查詢操作走從庫public List<Order> getOrders(Long userId) {Entity where = Entity.create("order").set("user_id", userId);return Db.use(DsFactory.get("slave")).query(where, Order.class);}
}
  1. 多租戶系統:不同租戶用不同數據庫

給每個租戶分配獨立數據庫,通過租戶 ID 切換數據源:

public class TenantService {// 根據租戶ID獲取數據源private DataSource getTenantDs(String tenantId) {// 檢查是否已注冊該租戶數據源if (!DsFactory.contains(tenantId)) {// 從配置中心獲取租戶數據庫信息(實際項目中從配置中心獲取)String url = "jdbc:mysql://localhost:3306/tenant_" + tenantId;DbConfig config = new DbConfig();config.setUrl(url);config.setUsername("root");config.setPassword("123456");// 注冊數據源DsFactory.register(tenantId, config);}return DsFactory.get(tenantId);}// 操作租戶數據public List<User> getTenantUsers(String tenantId) {return Db.use(getTenantDs(tenantId)).query(Entity.create("user"), User.class);}
}
  1. 臨時數據處理:動態創建數據源

處理臨時任務時,動態創建數據源,用完即刪:

public class TempDataService {public void processTempData(String dbPath) {// 動態注冊SQLite數據源String dsName = "temp_" + System.currentTimeMillis();DbConfig config = new DbConfig();config.setUrl("jdbc:sqlite:" + dbPath);config.setDriver("org.sqlite.JDBC");DsFactory.register(dsName, config);try {// 處理數據Db.use(DsFactory.get(dsName)).execute("select * from temp_data");} finally {// 移除數據源DsFactory.unregister(dsName);}}
}

四、優勢

  • 配置簡單:一個db.setting文件搞定所有數據源,不用寫 XML

  • 切換方便:通過名稱獲取數據源,一行代碼完成切換,不用 AOP

  • 支持廣泛:各種關系型數據庫、嵌入式數據庫都能管理

  • 動態靈活:運行時可以添加、移除數據源,適合動態場景

當然它也有局限:復雜的分庫分表場景還是需要 Sharding-JDBC,但普通多數據源場景用它足夠了。

五、細節注意

  • 默認數據源必須有:至少要配置一個default數據源,否則會報錯

  • 驅動包要配齊:使用哪種數據庫,就要添加對應的驅動依賴,不然會提示 “找不到驅動類”

  • 連接池參數要合理:根據業務量調整maxActive等參數,避免連接數過多導致數據庫壓力過大

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

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

相關文章

Mysql中事務隔離級別有哪些?

Mysql中事務隔離級別有哪些&#xff1f; 讀未提交&#xff1a; 一個事務可以看到另一個事務尚未提交的數據。可能導致臟讀。 讀已提交&#xff1a; 一個事務只能看到其他事務提交后的數據。避免了臟讀&#xff0c;仍可能引發不可重復讀。 可重復讀&#xff1a; 可以確保一個事務…

el-carousel在新增或者刪除el-carousel-item時默認跳到第一頁的原因和解決

現象 使用走馬燈效果時 當el-carousel-item增加或者減少時&#xff0c;頁會跳到第一頁 體驗很不友好。 原因 當新增或這刪除el-carousel-item時&#xff0c;會觸發setActiveIndex&#xff08;props.initialindex&#xff09;, setActiveIndex的行為是小于0或者大于最大頁會有一…

人工智能學習:機器學習相關面試題(二)

7、有監督學習和無監督學習的區別 有監督學習&#xff1a; 對具有概念標記&#xff08;分類&#xff09;的訓練樣本進行 學習&#xff0c;以盡可能對訓練樣本集外的數據進行 標記&#xff08;分類&#xff09;預測。 這里 &#xff0c;所有的標記&#xff08;分類&#xff09…

python如何下載svg圖片

# 生成博客文章框架代碼 import datetimeblog_content f"""# Python如何下載SVG圖片## 引言 SVG&#xff08;可縮放矢量圖形&#xff09;作為一種基于XML的矢量圖形格式&#xff0c;在Web開發中廣泛應用。本文將介紹如何使用Python從網絡下載SVG圖片&#xff0…

Linux(一) | 初識Linux與目錄管理基礎命令掌握

個人主頁-愛因斯晨 文章專欄-Linux 最近學習人工智能時遇到一個好用的網站分享給大家&#xff1a; 人工智能學習 文章目錄個人主頁-愛因斯晨文章專欄-Linux一、前言1.為什么學習Linux2.操作系統概述&#xff1a;3.常見的操作系統&#xff1a;二、初識Linux1.誕生2.什么是Linux…

android-studio 安裝

下載地址 國內&#xff1a;https://developer.android.google.cn/studio?hlzh-cn 全國&#xff1a;https://developer.android.com/studio 1.設置 ANDROID_HOME 環境變量 ANDROID_HOME D:\zhy\android-studio\sdk 2. 更新 PATH 環境變量 %ANDROID_HOME%\platform-tools %AN…

【重學MySQL】九十三、MySQL字符集與比較規則完全解析

【重學MySQL】九十三、MySQL字符集與比較規則完全解析一、字符集概述1.1 支持的字符集1.2 UTF8與UTF8MB4的區別二、比較規則&#xff08;Collation&#xff09;2.1 比較規則分類2.2 常見比較規則差異三、配置層級與繼承關系3.1 配置層級3.2 繼承關系四、最佳實踐與問題解決4.1 …

基于Kafka的延遲隊列

實現原理 通過topic區分不同的延遲時長&#xff0c;每個topic對于一個延遲&#xff0c;比如 topic100 僅存儲延遲 100ms 的消息&#xff0c;topic1000 僅存儲延遲 1s 的消息&#xff0c;依次類推。生產消息時&#xff0c;消息需按延遲時長投遞到對應的topic。消費消息時&#x…

LabVIEW轉速儀校準系統

LabVIEW 與機器視覺的智能校準系統以工控機為核心&#xff0c;整合標準源、智能相機等硬件&#xff0c;通過軟件實現校準流程自動化&#xff0c;支持 500-6000r/min 轉速范圍校準&#xff0c;覆蓋 5 類轉速測量儀&#xff0c;校準時間縮短約 70%&#xff0c;滿足計量院高效、精…

Synchronized 概述

1. 初識 synchronized 是 Java 中的關鍵字&#xff0c;是一種 同步鎖 &#xff0c;可重入鎖&#xff0c;悲觀鎖。它修飾的對象有以下幾種&#xff1a; 具體表現為以下3種形式。 對于普通同步方法&#xff0c;鎖是當前實例對象。 對于靜態同步方法&#xff0c;鎖是當前類的 Clas…

通過Auth.log來查看VPS服務器是否被掃描和暴力破解及解決辦法

說明&#xff1a;很多人vps可能出現過被掃的情況&#xff0c;有的還被爆破了&#xff0c;這里提供下查看方法 查看用密碼登陸成功的IP地址及次數grep "Accepted password for root" /var/log/auth.log | awk {print $11} | sort | uniq -c | sort -nr | more查看用密…

碰一碰發視頻手機版源碼開發:支持OEM

**從事開發 20 年&#xff0c;見過不少技術風口起起落落&#xff0c;最近 “碰一碰發視頻” 又成了熱門話題。不少同行或剛入行的年輕人來問我&#xff0c;手機版源碼開發該從哪下手&#xff0c;怕踩坑、怕走彎路。今天就以一個老程序員的視角&#xff0c;把碰一碰發視頻手機版…

只出現一次的數字(總結)

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄前言一、給定一個整數數組nums&#xff0c;除了某個元素只出現一次以外&#xff0c;其余元素均出現兩次。找出那個只出現一次的元素二、給你一個整數數組nums&#x…

Cesium 入門教程(十一):Camera相機功能展示

文章目錄一&#xff0c;Cesium 實際示例&#xff08;含源代碼&#xff09;1&#xff0c;vuecesium&#xff1a; 圍繞一個固定點自動左右旋轉2&#xff0c;vuecesium&#xff1a; flyto一個具體的實體位置3&#xff0c;vuecesium&#xff1a; flyto一個具體的點位置4&#xff0c…

go語言基本排序算法

package mainimport "fmt"func main() {BubbleSort()SelectSort()InsertSort()MergeSort()QuickSort()HeapSort()ShellSort() }//冒泡排序 func BubbleSort() {str : []int{9, 1, 5, 8, 3, 7, 4, 6, 2}for i : 0; i < len(str)-1; i {flag : falsefor j : len(str…

一步完成CalDAV賬戶同步,日歷服務助力釘釘日歷日程集中管理

在信息爆炸節奏飛快的今天&#xff0c;高效的管理時間已經成為我們工作和生活中的核心競爭力&#xff0c;復雜紛繁的日程安排&#xff0c;無處不在的提醒需求以及跨設備同步的困擾&#xff0c;這些問題仿佛都在呼喚著一個更智能、更便捷、更可靠的解決方案。 而華為日歷App&am…

企業內部機密視頻安全保護|如何防止企業內部機密視頻泄露?

在企業數字化進程飛速發展的今天&#xff0c;視頻內容已成為承載企業內部培訓、戰略會議、產品機密和核心技術的關鍵載體。一次意外的泄露&#xff0c;不僅可能導致知識產權流失&#xff0c;更會讓企業聲譽和市場競爭力遭受重創。面對無孔不入的安全威脅&#xff0c;企業該如何…

C# Deconstruct | 簡化元組與對象的數據提取

官方文檔&#xff1a;析構元組和其他類型 - C# | Microsoft Learn 標簽&#xff1a;Deconstruct、Tuple、record、模式匹配 PS&#xff1a;record相關內容后續還會繼續更新&#x1f504; 模式匹配可以查看我的另一篇&#x1f449;模式匹配 目錄1. 概述2. 基本用法2.1 元組解…

R 語言 ComplexUpset 包實戰:替代 Venn 圖的高級集合可視化方案

摘要 在生物信息學、數據挖掘等領域的集合分析中,傳統 Venn 圖在多維度數據展示時存在信息擁擠、可讀性差等問題。本文基于 R 語言的 ComplexUpset 包,以基因表達研究為場景,從包安裝、數據準備到可視化實現,完整演示如何制作正刊級別的集合交集圖,解決多條件下差異基因(…

?導游|基于SprinBoot+vue的在線預約導游系統

在線預約導游系統 基于SprinBootvue的在線預約導游系統 一、前言 二、系統設計 三、系統功能設計 前臺功能實現 后臺功能實現 管理員模塊實現 導游模塊實現 用戶模塊實現 四、數據庫設計 五、核心代碼 六、論文參考 七、最新計算機畢設選題推薦 八、源碼獲取&am…