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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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…