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

embedded/2024/11/20 22:54:38/

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,并自动管理它们:

java">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维护当前线程的数据源信息:

java">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

java">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

http://www.ppmy.cn/embedded/139205.html

相关文章

ssm144基于SSM的校园二手物品交易平台+vue(论文+源码)_kaic

毕 业 设 计&#xff08;论 文&#xff09; 题目&#xff1a;校园二手物品交易平台设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本校园二手物品…

[STM32]从零开始的vs code 连接keil教程

一、前言 相信现在正在学习嵌入式或者是正在学习STM32的大家对keil都不陌生&#xff0c;keil是一款集成了多款芯片的嵌入式联合编译器。因为keil强大的芯片支持和及其易用的调试功能使其广受人们喜爱。但同时keil在某些方面也存在一定的问题。目前来说keil虽然有非常多好用的功…

安卓APK安装包arm64-v8a、armeabi-v7a、x86、x86_64有何区别?如何选择?

在GitHub网站下载Android 安装包&#xff0c;Actions资源下的APK文件通常有以下版本供选择&#xff1a; 例如上图是某Android客户端的安装包文件&#xff0c;有以下几个版本可以选择&#xff1a; mobile-release.apk&#xff08;通用版本&#xff0c;体积最大&#xff09;mobi…

llm 从0开始学习大语言模型, transformer架构学习

1. github&#xff1a; https://github.com/rasbt/LLMs-from-scratch 2. 这个是一本书&#xff0c;写在了github. 里面有代码&#xff0c;有讲解。从0开始写个llm 3. 如果看不懂&#xff0c;知乎有人写的中文版学习笔记&#xff1a; https://zhuanlan.zhihu.com/p/681401085

Pr:音频过渡

Adobe Premiere Pro 自带一组共三个音频过渡 Audio Transitions效果。 对音频剪辑之间应用交叉淡化 Crossfade过渡&#xff0c;操作方式类似于应用视频过渡效果。 对于交叉淡化&#xff0c;要保证前剪辑的出点之后及后剪辑的入点之前有足够的预留内容&#xff08;也称“手柄”&…

C语言之结构体

结构体 作用: 结构体是一种构造类型的数据结构 是一种或多种基本类型或构造类型的数据的集合 可自定义 定义: 1,一般定义方式 struct 结构体名称 { //定义变量 }; 2,定义结构体时顺带创建一个结构体变量 struct 结构体名称 { //定义变量 }结构体变量名; 3,给结构体起别名 typed…

基于机器学习电信号EMG训练分类模型控制仿生手控制系统(Matlab-Simulink实现)

基于机器学习电信号EMG训练分类模型控制仿生手控制系统&#xff08;Matlab-Simulink实现&#xff09; 引言 随着生物医学工程和机器学习技术的发展&#xff0c;仿生手控制系统的研发取得了显著进展。本文将介绍如何利用机器学习方法&#xff0c;通过肌电图&#xff08;Electr…

基于深度学习的文本信息提取方法研究(pytorch python textcnn框架)

&#x1f497;博主介绍&#x1f497;&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示&#xff1a;文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…