当前位置: 首页 > news >正文

Spring Boot 中 Druid 连接池与多数据源切换的方法

Spring Boot 中 Druid 连接池与多数据源切换的方法

在Spring Boot项目中,使用Druid连接池和进行多数据源切换是常见的需求,尤其是在需要读写分离、数据库分片等复杂场景下。本文将详细介绍如何在Spring Boot中配置Druid连接池并实现多数据源切换。

一、Druid连接池简介

Druid是阿里巴巴开源的一个数据库连接池,它不仅提供了高效的数据库连接管理,还具备监控、扩展等强大功能。Druid的主要特点包括:

  1. 监控能力:提供了详细的监控页面,可以实时监控SQL执行情况、连接池状态等。
  2. 扩展能力:支持多种数据库类型,并且可以通过插件机制进行扩展。
  3. 高效性能:通过一系列优化手段,提高了连接池的性能和稳定性。
二、Spring Boot中配置Druid连接池

在Spring Boot中配置Druid连接池相对简单,只需在pom.xml中添加相应的依赖,并在application.ymlapplication.properties中进行配置即可。

1. 添加依赖

pom.xml中添加Druid和Spring Boot Starter JDBC的依赖:

<dependencies><!-- Druid连接池依赖 --><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.6</version></dependency><!-- Spring Boot Starter JDBC依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><!-- MySQL驱动依赖 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><!-- 其他依赖 -->
</dependencies>
2. 配置数据源

application.ymlapplication.properties中配置数据源信息。例如,在application.yml中:

spring:datasource:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/db01?serverTimezone=UTC&useUnicode=true&characterEncoding=UTF8&useSSL=falseusername: rootpassword: 123456initial-size: 1min-idle: 1max-active: 20test-on-borrow: true# Druid其他配置druid:validation-query: SELECT 1 FROM DUALtest-while-idle: truetime-between-eviction-runs-millis: 60000min-evictable-idle-time-millis: 300000pool-prepared-statements: truemax-pool-prepared-statement-per-connection-size: 20stat-view-servlet:enabled: trueurl-pattern: /druid/*filter:stat:log-slow-sql: trueslow-sql-millis: 2000
三、多数据源切换的实现

在Spring Boot中实现多数据源切换,可以通过继承AbstractRoutingDataSource类来实现。AbstractRoutingDataSource是Spring提供的一个抽象类,用于支持动态数据源切换。

1. 引入必要的依赖

除了Druid和Spring Boot Starter JDBC的依赖外,还需要引入MyBatis相关的依赖(如果项目使用MyBatis):

<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.1</version>
</dependency>
2. 配置多数据源

application.yml中配置多个数据源的信息,例如:

spring:datasource:type: com.alibaba.druid.pool.DruidDataSourcedatasource1:url: jdbc:mysql://127.0.0.1:3306/db01?serverTimezone=UTC&useUnicode=true&characterEncoding=UTF8&useSSL=falseusername: rootpassword: 123456initial-size: 1min-idle: 1max-active: 20test-on-borrow: truedriver-class-name: com.mysql.cj.jdbc.Driverdatasource2:url: jdbc:mysql://127.0.0.1:3306/db02?serverTimezone=UTC&useUnicode=true&characterEncoding=UTF8&useSSL=falseusername: rootpassword: 123456initial-size: 1min-idle: 1max-active: 20test-on-borrow: truedriver-class-name: com.mysql.cj.jdbc.Driverdatasource3:url: jdbc:mysql://127.0.0.1:3306/db03?serverTimezone=UTC&useUnicode=true&characterEncoding=UTF8&useSSL=falseusername: rootpassword: 123456initial-size: 1min-idle: 1max-active: 20test-on-borrow: truedriver-class-name: com.mysql.cj.jdbc.Driver
3. 创建数据源配置类

创建数据源配置类,将每个数据源配置为Bean,并自动管理它们:

import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Qualifier;
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 javax.sql.DataSource;@Configuration
public class DynamicDataSourceConfig {@Bean@ConfigurationProperties(prefix = "spring.datasource.datasource1")public DataSource dataSource1() {return DruidDataSourceBuilder.create().build();}@Bean@ConfigurationProperties(prefix = "spring.datasource.datasource2")public DataSource dataSource2() {return DruidDataSourceBuilder.create().build();}@Bean@ConfigurationProperties(prefix = "spring.datasource.datasource3")public DataSource dataSource3() {return DruidDataSourceBuilder.create().build();}@Beanpublic DataSourceTransactionManager dataSourceTransactionManager1(@Qualifier("dataSource1") DataSource dataSource1) {DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();dataSourceTransactionManager.setDataSource(dataSource1);return dataSourceTransactionManager;}@Beanpublic DataSourceTransactionManager dataSourceTransactionManager2(@Qualifier("dataSource2") DataSource dataSource2) {DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();dataSourceTransactionManager.setDataSource(dataSource2);return dataSourceTransactionManager;}// 同理,可以创建dataSourceTransactionManager3等
}
4. 创建数据源上下文持有者

使用ThreadLocal维护当前线程的数据源信息:

public class DataSourceContextHolder {private static final ThreadLocal<String> HOLDER = new InheritableThreadLocal<>();public static void setDataSource(String key) {HOLDER.set(key);}public static String getDataSource() {return HOLDER.get();}public static void clearDataSource() {HOLDER.remove();}
}
5. 创建动态数据源类

创建动态数据源类,继承AbstractRoutingDataSource

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;public class DynamicDataSource extends AbstractRoutingDataSource {private static final Map<Object, Object> TARGET_DATA_SOURCES = new HashMap<>();static {// 将多个数据源添加到TARGET_DATA_SOURCES中TARGET_DATA_SOURCES.put("ds1", dataSource1());TARGET_DATA_SOURCES.put("ds2", dataSource2());TARGET_DATA_SOURCES.put("ds3", dataSource3());}public DynamicDataSource() {super.setDefaultTargetDataSource(dataSource1());super.setTargetDataSources(TARGET_DATA_SOURCES);super.afterPropertiesSet();}@Override

相关文章:

Spring Boot 中 Druid 连接池与多数据源切换的方法

Spring Boot 中 Druid 连接池与多数据源切换的方法 在Spring Boot项目中&#xff0c;使用Druid连接池和进行多数据源切换是常见的需求&#xff0c;尤其是在需要读写分离、数据库分片等复杂场景下。本文将详细介绍如何在Spring Boot中配置Druid连接池并实现多数据源切换。 一、…...

JavaScrip中私有方法的创建

在 JavaScript 中&#xff0c;私有方法是指只能在类的内部使用&#xff0c;外部无法访问的函数。为了实现这一点&#xff0c;JavaScript 提供了几种方法&#xff0c;主要通过以下几种方式来创建私有方法&#xff1a; 1. 使用 #&#xff08;私有字段和方法&#xff09; 从 ECM…...

.Net Core根据文件名称自动注入服务

.Net Core根据文件名称自动注入服务 说明分析逻辑所有代码一键注入 说明 这个适用于.Net Core 的Web项目,且需要在服务中注入接口的需求.因为之前些Java Web习惯了,所以会有Dao层,Serivce层和Controller层.但是如果一个项目里面对于不同的数据库会有多个Dao,如果一个一个引入会…...

APT 参与者将恶意软件嵌入 macOS Flutter 应用程序中

发现了一些恶意软件样本&#xff0c;这些样本据信与朝鲜民主主义人民共和国 (DPRK)&#xff08;又称北朝鲜&#xff09;有关&#xff0c;这些样本使用 Flutter 构建&#xff0c;Flutter 的设计可以对恶意代码进行混淆。JTL 深入研究了恶意代码的工作原理&#xff0c;以帮助保护…...

第 3 章 -GO语言 基本语法

1. 注释 在编程中&#xff0c;注释是帮助理解代码的重要工具。Go语言支持两种类型的注释&#xff1a; 单行注释&#xff1a;以 // 开头&#xff0c;直到行尾都是注释。多行注释&#xff1a;以 /* 开始&#xff0c;以 */ 结束&#xff0c;可以跨越多行。 示例 package maini…...

【qt】控件

1.frameGeometry和Geometry区别 frameGeometry是开始从红圈开始算&#xff0c;Geometry从黑圈算 程序证明&#xff1a;使用一个按键&#xff0c;当按键按下,qdebug打印各自左上角的坐标&#xff08;相当于屏幕左上角&#xff09;&#xff0c;以及窗口大小 Widget::Widget(QWid…...

入侵检测算法平台部署LiteAIServer视频智能分析平台行人入侵检测算法:科技守护安全的新篇章

在现代化城市快速发展的背景下&#xff0c;安全防范已成为城市管理与社会生活中不可或缺的一环。随着人工智能、大数据、物联网等技术的飞速发展&#xff0c;智能化安防系统正逐步改变着传统的安全防护模式&#xff0c;特别是在行人入侵检测领域&#xff0c;视频智能分析平台Li…...

【AiPPT-注册/登录安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被机器执行自动化程序攻击&#xff0c;存在如下风险&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露&#xff0c;不符合国家等级保护的要求。短信盗刷带来的拒绝服务风险 &#xff0c;造成用户无法登陆、注册&#xff0c;大量收到垃圾短信的…...

【设计模式】行为型模式(二):策略模式、命令模式

行为型模式&#xff08;二&#xff09;&#xff1a;策略模式、命令模式 3.策略模式&#xff08;Strategy&#xff09;3.1 示例3.1.1 定义策略接口3.1.2 实现具体策略3.1.3 定义上下文类3.1.4 客户端代码3.1.5 输出结果 3.2 总结3.2.1 优点3.2.2 缺点 4.命令模式&#xff08;Com…...

STM32中断系统

目录 一、中断的基本概念 二、NVIC 1.NVIC的概念 2、NVIC的组成 3、NVIC的应用 4.NVIC的结构 三、外部中断EXTI 1.外部中断的概念 2.EXTI基本结构 四、EXTI外部中断的配置流程 1.开启APB2中的GPIO口/AFIO时钟 2.GPIO配置成输入模式 3.AFIO选择中断引脚 4.EXTI初始…...

window的Anaconda Powershell Prompt 里使用linux 命令

在 Windows 的 Anaconda Powershell Prompt 中使用 Linux 命令&#xff0c;可以通过以下几种方法来实现&#xff1a; 1. 使用 Git Bash 安装 Git for Windows 后&#xff0c;它会包含 Git Bash&#xff0c;允许在 Windows 上使用许多 Linux 命令。 步骤&#xff1a; 安装 Gi…...

Lisp 语言入门教程(一)

Lisp&#xff08;“LISt Processing”&#xff09;是一种古老而强大的编程语言&#xff0c;特别适合处理符号数据和列表。Lisp 是一种以括号和递归见长的语言&#xff0c;它启发了许多编程范式。以下是一个基础教程&#xff0c;帮助你快速了解 Lisp 的基本语法和功能。 1. 认识…...

Git - Think in Git

记录一些使用Git时的一些想法 区的概念 当 clone 仓库代码到本地后四个区相同 当编辑代码后&#xff0c;工作区 与其余三个区不同 当使用 add 将修改的代码暂存后&#xff0c;索引区与 工作区 相同 当使用 commit 将修改的代码提交后&#xff0c;仓库区 与 索引区 和 工作区 相…...

jmeter常用配置元件介绍总结之用linux服务器压测

系列文章目录 安装jmeter jmeter常用配置元件介绍总结之用linux服务器压测 1.编写测试脚本2.执行测试脚本 1.编写测试脚本 在linux服务器上进行压测&#xff0c;由于是没有界面的&#xff0c;因此我们可以先在界面上把压测脚本写好&#xff1a; 如图&#xff1a;我这里简单的写…...

VL210-Q4 适用于USB延长线 扩展坞

VL210芯片技术文档 一、概述 VL210是一款由VIA Technologies&#xff08;威盛电子&#xff09;生产的第四代先进USB 3.0 Hub控制器。它集成了多种先进技术和功能&#xff0c;适用于各种USB集线器应用&#xff0c;如独立的USB集线器、笔记本/Ultrabook停靠点/port-replicators…...

怎么样绑定域名到AWS(亚马逊云)服务器

1&#xff0c;拿着你买的域名去亚马逊申请一个证书。申请证书分两种&#xff0c;一种是去亚马逊后台填域名手动申请 &#xff0c;另一种是通过API来申请&#xff0c;类似如下代码&#xff1a; 2、证验证书。有两种方式&#xff1a;一种是通过邮件&#xff0c;另一种去到域名提供…...

Clickhouse集群新建用户、授权以及remote权限问题

新建用户 create user if not exists user on cluster 集群名称 IDENTIFIED WITH plaintext_password BY 密码;给用户授查询、建表、删表的权限 GRANT create table,select,drop table ON 数据库实例.* TO user on cluster 集群名称 ;在其他节点下用户建本地表成功&#…...

OPENCV 检测直线[opencv--3]

opencv中集成了很多好用的函数&#xff0c;比如霍夫变换检测直线的函数&#xff0c;当然&#xff0c;考虑到看我文章的人水平&#xff0c;我这里只讲讲如何使用这个函数&#xff0c;和怎么调节其中的参数 先把运行效果PO出来吧 #include "CV_ERROR.h" #include &q…...

FFmpeg 4.3 音视频-多路H265监控录放C++开发十三.2:avpacket中包含多个 NALU如何解析头部分析

前提&#xff1a; 注意的是&#xff1a;我们这里是从avframe转换成avpacket 后&#xff0c;从avpacket中查看NALU。 在实际开发中&#xff0c;我们有可能是从摄像头中拿到 RGB 或者 PCM&#xff0c;然后将pcm打包成avframe&#xff0c;然后将avframe转换成avpacket&#xff0…...

【MATLAB】目标检测初探

文章目录 0 前言1 目标检测概述2 算法实践2.1 YOLO v22.2 YOLO v3 3 项目实践3.1 项目背景和数据集3.2 实践结果3.3 算法对比 4 工具箱与数据标注5 总结 0 前言 之前因为项目原因&#xff0c;做了一个基于YOLOv5实现目标检测的程序&#xff0c;是基于Python做的&#xff0c;直接…...

# 让工具自己声明并发安全:我把调度逻辑砍到一行

让工具自己声明并发安全&#xff1a;我把调度逻辑砍到一行 这是 《写完一个 AI 编程助手之后&#xff0c;我才确定 prompt 工程不是重点》 的第四篇。前几篇讲了进程模型和权限系统&#xff0c;这一篇讲并发调度。 代码&#xff1a;[https://github.com/sishenaichipingguo/cod…...

钉钉里藏了个 AI 员工?OpenClaw 接入玩法深度拆解

​前言 本文将指导您如何将OpenClaw工具与钉钉企业内部机器人进行无缝对接&#xff0c;实现业务信息和任务的自动化同步&#xff0c;有效提升团队协作效率。我们提供了完整的接入流程指南&#xff0c;包含详细的操作步骤、常见问题解决方案以及实用优化技巧&#xff0c;帮助开…...

HTTPS单向认证、双向认证、抓包原理与反抓包策略详解

HTTPS单向认证、双向认证、抓包原理与反抓包策略详解 一、HTTPS单向认证 HTTPS单向认证是只要求站点部署 SSL证书&#xff0c;客户端会去验证服务器的身份&#xff0c;而服务器不会去验证客户端的身份。这种认证方式相对简单&#xff0c;但可以提供一定的 安全性。任何用户都可…...

告别复制粘贴:如何在 Cursor / 各种 IDE 中丝滑接入本地 AI 模型?

引言:AI 编程时代的囚徒困境 2026 年,AI 编程助手已经像 Git 一样成为每个开发者的标配。Cursor 的订阅量持续暴涨,GitHub Copilot 的免费版已经吸引了上千万用户,JetBrains 全线 IDE 都深度集成了 AI Agent。但在这个表面繁荣的生态之下,每一位开发者都在不知不觉中交出…...

时间序列预测损失函数全解析:从MSE到分位数损失的选择指南

1. 项目概述&#xff1a;为什么时间序列预测的损失函数值得深究&#xff1f;做时间序列预测&#xff0c;无论是金融市场的股价波动、电商平台的销量起伏&#xff0c;还是工业设备的传感器读数&#xff0c;我们最终都要面对一个核心问题&#xff1a;如何衡量模型预测得好不好&am…...

7天掌握FontForge:免费开源字体编辑器的完整使用指南

7天掌握FontForge&#xff1a;免费开源字体编辑器的完整使用指南 【免费下载链接】fontforge Free (libre) font editor for Windows, Mac OS X and GNULinux 项目地址: https://gitcode.com/gh_mirrors/fo/fontforge 你是否曾梦想设计属于自己的字体&#xff1f;无论是…...

Unity3D RPG游戏开发实战:从零搭建角色与场景交互系统(含源码)

1. Unity3D RPG游戏开发基础准备 第一次打开Unity3D时&#xff0c;很多人会被复杂的界面吓到。别担心&#xff0c;我们先从最基础的设置开始。我建议使用2021 LTS版本&#xff0c;这个版本稳定性好&#xff0c;社区支持也完善。安装完成后&#xff0c;记得在Hub里勾选"Wi…...

告别卡顿!用华为云ECS搭建eNSP Pro大型网络实验的保姆级避坑指南

华为云ECS部署eNSP Pro全流程性能优化实战 当你在本地PC上尝试运行包含20台NE路由器的复杂拓扑时&#xff0c;风扇狂转的噪音和逐渐卡死的界面是否让你抓狂&#xff1f;作为一位曾经被32GB内存工作站折磨过的网络工程师&#xff0c;我完全理解这种痛苦。直到发现华为云ECS这个&…...

别再死记硬背了!一张图搞懂BST、AVL、红黑树的区别与选型

可视化解析&#xff1a;三大树结构的核心差异与工程实践指南 每次面对技术面试中"为什么Java的TreeMap用红黑树而不用AVL树"这类问题时&#xff0c;你是否会感到一阵心虚&#xff1f;作为曾在多个分布式系统中亲手实现过树结构的工程师&#xff0c;我深刻理解这种困…...

嵌入式数据存储终极指南:5分钟快速上手FlashDB超轻量级数据库

嵌入式数据存储终极指南&#xff1a;5分钟快速上手FlashDB超轻量级数据库 【免费下载链接】FlashDB An ultra-lightweight database that supports key-value and time series data | 一款支持 KV 数据和时序数据的超轻量级数据库 项目地址: https://gitcode.com/gh_mirrors/…...