Spring Boot 中 Druid 连接池与多数据源切换的方法
Spring Boot 中 Druid 连接池与多数据源切换的方法
在Spring Boot项目中,使用Druid连接池和进行多数据源切换是常见的需求,尤其是在需要读写分离、数据库分片等复杂场景下。本文将详细介绍如何在Spring Boot中配置Druid连接池并实现多数据源切换。
一、Druid连接池简介
Druid是阿里巴巴开源的一个数据库连接池,它不仅提供了高效的数据库连接管理,还具备监控、扩展等强大功能。Druid的主要特点包括:
- 监控能力:提供了详细的监控页面,可以实时监控SQL执行情况、连接池状态等。
- 扩展能力:支持多种数据库类型,并且可以通过插件机制进行扩展。
- 高效性能:通过一系列优化手段,提高了连接池的性能和稳定性。
二、Spring Boot中配置Druid连接池
在Spring Boot中配置Druid连接池相对简单,只需在pom.xml中添加相应的依赖,并在application.yml或application.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.yml或application.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项目中,使用Druid连接池和进行多数据源切换是常见的需求,尤其是在需要读写分离、数据库分片等复杂场景下。本文将详细介绍如何在Spring Boot中配置Druid连接池并实现多数据源切换。 一、…...
JavaScrip中私有方法的创建
在 JavaScript 中,私有方法是指只能在类的内部使用,外部无法访问的函数。为了实现这一点,JavaScript 提供了几种方法,主要通过以下几种方式来创建私有方法: 1. 使用 #(私有字段和方法) 从 ECM…...
.Net Core根据文件名称自动注入服务
.Net Core根据文件名称自动注入服务 说明分析逻辑所有代码一键注入 说明 这个适用于.Net Core 的Web项目,且需要在服务中注入接口的需求.因为之前些Java Web习惯了,所以会有Dao层,Serivce层和Controller层.但是如果一个项目里面对于不同的数据库会有多个Dao,如果一个一个引入会…...
APT 参与者将恶意软件嵌入 macOS Flutter 应用程序中
发现了一些恶意软件样本,这些样本据信与朝鲜民主主义人民共和国 (DPRK)(又称北朝鲜)有关,这些样本使用 Flutter 构建,Flutter 的设计可以对恶意代码进行混淆。JTL 深入研究了恶意代码的工作原理,以帮助保护…...
第 3 章 -GO语言 基本语法
1. 注释 在编程中,注释是帮助理解代码的重要工具。Go语言支持两种类型的注释: 单行注释:以 // 开头,直到行尾都是注释。多行注释:以 /* 开始,以 */ 结束,可以跨越多行。 示例 package maini…...
【qt】控件
1.frameGeometry和Geometry区别 frameGeometry是开始从红圈开始算,Geometry从黑圈算 程序证明:使用一个按键,当按键按下,qdebug打印各自左上角的坐标(相当于屏幕左上角),以及窗口大小 Widget::Widget(QWid…...
入侵检测算法平台部署LiteAIServer视频智能分析平台行人入侵检测算法:科技守护安全的新篇章
在现代化城市快速发展的背景下,安全防范已成为城市管理与社会生活中不可或缺的一环。随着人工智能、大数据、物联网等技术的飞速发展,智能化安防系统正逐步改变着传统的安全防护模式,特别是在行人入侵检测领域,视频智能分析平台Li…...
【AiPPT-注册/登录安全分析报告-无验证方式导致安全隐患】
前言 由于网站注册入口容易被机器执行自动化程序攻击,存在如下风险: 暴力破解密码,造成用户信息泄露,不符合国家等级保护的要求。短信盗刷带来的拒绝服务风险 ,造成用户无法登陆、注册,大量收到垃圾短信的…...
【设计模式】行为型模式(二):策略模式、命令模式
行为型模式(二):策略模式、命令模式 3.策略模式(Strategy)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.命令模式(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 命令,可以通过以下几种方法来实现: 1. 使用 Git Bash 安装 Git for Windows 后,它会包含 Git Bash,允许在 Windows 上使用许多 Linux 命令。 步骤: 安装 Gi…...
Lisp 语言入门教程(一)
Lisp(“LISt Processing”)是一种古老而强大的编程语言,特别适合处理符号数据和列表。Lisp 是一种以括号和递归见长的语言,它启发了许多编程范式。以下是一个基础教程,帮助你快速了解 Lisp 的基本语法和功能。 1. 认识…...
Git - Think in Git
记录一些使用Git时的一些想法 区的概念 当 clone 仓库代码到本地后四个区相同 当编辑代码后,工作区 与其余三个区不同 当使用 add 将修改的代码暂存后,索引区与 工作区 相同 当使用 commit 将修改的代码提交后,仓库区 与 索引区 和 工作区 相…...
jmeter常用配置元件介绍总结之用linux服务器压测
系列文章目录 安装jmeter jmeter常用配置元件介绍总结之用linux服务器压测 1.编写测试脚本2.执行测试脚本 1.编写测试脚本 在linux服务器上进行压测,由于是没有界面的,因此我们可以先在界面上把压测脚本写好: 如图:我这里简单的写…...
VL210-Q4 适用于USB延长线 扩展坞
VL210芯片技术文档 一、概述 VL210是一款由VIA Technologies(威盛电子)生产的第四代先进USB 3.0 Hub控制器。它集成了多种先进技术和功能,适用于各种USB集线器应用,如独立的USB集线器、笔记本/Ultrabook停靠点/port-replicators…...
怎么样绑定域名到AWS(亚马逊云)服务器
1,拿着你买的域名去亚马逊申请一个证书。申请证书分两种,一种是去亚马逊后台填域名手动申请 ,另一种是通过API来申请,类似如下代码: 2、证验证书。有两种方式:一种是通过邮件,另一种去到域名提供…...
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中集成了很多好用的函数,比如霍夫变换检测直线的函数,当然,考虑到看我文章的人水平,我这里只讲讲如何使用这个函数,和怎么调节其中的参数 先把运行效果PO出来吧 #include "CV_ERROR.h" #include &q…...
FFmpeg 4.3 音视频-多路H265监控录放C++开发十三.2:avpacket中包含多个 NALU如何解析头部分析
前提: 注意的是:我们这里是从avframe转换成avpacket 后,从avpacket中查看NALU。 在实际开发中,我们有可能是从摄像头中拿到 RGB 或者 PCM,然后将pcm打包成avframe,然后将avframe转换成avpacket࿰…...
【MATLAB】目标检测初探
文章目录 0 前言1 目标检测概述2 算法实践2.1 YOLO v22.2 YOLO v3 3 项目实践3.1 项目背景和数据集3.2 实践结果3.3 算法对比 4 工具箱与数据标注5 总结 0 前言 之前因为项目原因,做了一个基于YOLOv5实现目标检测的程序,是基于Python做的,直接…...
Boss-Key:职场隐私保护与效率提升的开源解决方案
Boss-Key:职场隐私保护与效率提升的开源解决方案 【免费下载链接】Boss-Key 老板来了?快用Boss-Key老板键一键隐藏静音当前窗口!上班摸鱼必备神器 项目地址: https://gitcode.com/gh_mirrors/bo/Boss-Key 在数字化办公环境中ÿ…...
编写程序让智能洗手液机检测手部靠近,自动出液,无需按压。
🧼 项目实战:基于红外测距的智能洗手液机控制系统一、实际应用场景描述 (Scenario)在机场、医院、办公楼等公共场所,传统的按压式洗手液机存在卫生隐患——每个人都需要接触同一个泵头,容易造成细菌交叉感染。目标:通过…...
Windows资源管理器终极美化指南:一键添加惊艳毛玻璃效果
Windows资源管理器终极美化指南:一键添加惊艳毛玻璃效果 【免费下载链接】ExplorerBlurMica Add background Blur effect or Acrylic (Mica for win11) effect to explorer for win10 and win11 项目地址: https://gitcode.com/gh_mirrors/ex/ExplorerBlurMica …...
Python制作简易PDF查看工具——PDFViewerV1.0
PDFViewer PDF浏览工具,是使用Python语言(使用PyQt5开发界面,PDF解析使用PyMuPDF开源模块)开发的PDF查看工具,已经实现基本翻页浏览、OCR文字识别(基于开源主流文字识别模型实现)、内容查找高亮…...
3步深度配置Obsidian Copilot:打造专属AI知识工作流
3步深度配置Obsidian Copilot:打造专属AI知识工作流 【免费下载链接】obsidian-copilot A ChatGPT Copilot in Obsidian 项目地址: https://gitcode.com/gh_mirrors/ob/obsidian-copilot 在信息爆炸时代,知识工作者面临的最大挑战不是获取信息&am…...
39569
56968...
【adb端口5555】烽火hg680系列安卓9线刷全攻略:告别强制升级与花屏困扰
1. 烽火HG680系列机顶盒的痛点与解决方案 最近在折腾烽火HG680-GY和HG680-GC这两款机顶盒的朋友应该都深有体会,官方系统用着用着就会弹出强制升级提示,有时候还会莫名其妙出现花屏问题。作为一个折腾过不下20台烽火盒子的老玩家,我太理解这种…...
终极实战指南:在Docker容器中运行Windows系统的完整解决方案
终极实战指南:在Docker容器中运行Windows系统的完整解决方案 【免费下载链接】windows Windows inside a Docker container. 项目地址: https://gitcode.com/GitHub_Trending/wi/windows 还在为Windows虚拟机占用大量系统资源而烦恼吗?想体验在容…...
基于NLP的计算机毕业设计智能客服助手:从零搭建到性能优化实战
背景痛点:毕业设计智能客服的常见“坑” 很多计算机专业的同学在做毕业设计时,会选择智能客服助手这个方向,因为它既贴近实际应用,又能综合运用NLP、Web开发、数据库等多门课程知识。但真正动手后,常常会遇到几个让人…...
利用快马AI三分钟生成Python哈希表原型,快速验证数据存储方案
今天在做一个数据处理的小项目时,突然需要快速验证一个数据存储方案。想到哈希表这种高效的数据结构正好适合,但自己从头实现又太费时间。正好最近在用InsCode(快马)平台,发现它的AI辅助功能可以快速生成可运行的原型代码,于是尝试…...
