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

server/2024/11/20 20:39:56/

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/server/143535.html

相关文章

HarmonyOS Next 关于页面渲染的性能优化方案

HarmonyOS Next 关于页面渲染的性能优化方案 HarmonyOS Next 应用开发中&#xff0c;用户的使用体验至关重要。其中用户启动APP到呈现页面主要包含三个步骤&#xff1a; 框架初始化页面加载布局渲染 从页面加载到布局渲染中&#xff0c;主要包含了6个环节&#xff1a; 执行页…

vue2动态导出多级表头表格

需求&#xff1a;导出多级表格&#xff0c;如下&#xff0c;每个人名对应的是不同的城市金钱和年龄&#xff0c;日期占俩行&#xff0c;需要根据数据进行动态展示 1.效果 2.关键代码讲解 2.1数据源 2.2所需插件 npm install xlsx 2.3关键代码 创建name组和date组&#xff0c…

2024-11-19 kron积

若A[a11 a12; a21 a22]; B[b11 b12; b21 b22]; 则C[a11*b11 a12*b11 a21*b11 a22*b11; a11*b12 a12*b12 a21*b12 a22*b12; a11*b21 a12*b21 a21*b21 a22*b21; a11*b22 a12*b22 a21*b22 a22*b22] 用MATLAB实现 方法1&#xff1a; A [a11 a12; a21 a22]; B [b11 b12; b21 b22]…

线程(一)——初识线程

概念&#xff1a; 1、线程是什么 线程是一个“执行流”。每个线程之间可以按照自己的顺序执行自己的代码&#xff0c;多个线程之间还可以同时执行多份代码。 用银行来举例子&#xff1a;一个人去银行办理业务&#xff0c;多个业务一个人跑肯定是效率不高&#xff0c;这时候就需…

【1】猫眼娱乐后端开发面试题整理

[1]. 全量索引和增量索引的区别 全量索引&#xff1a;检索系统在启动时一次性读取当前数据库中的所有数据&#xff0c;建立索引。 增量索引&#xff1a;系统运行过程中&#xff0c;监控数据库的变化&#xff0c;即增量&#xff0c;实时加载更新&#xff0c;构建索引。 [2]. …

3D Gaussian Splatting 代码层理解之Part1

2023 年初,来自法国蔚蓝海岸大学和 德国马克斯普朗克学会的作者发表了一篇题为“用于实时现场渲染的 3D 高斯泼溅”的论文3d_gaussian_splatting。该论文提出了实时神经渲染的重大进步,超越了NeRF等以往方法的实用性。高斯泼溅不仅减少了延迟,而且达到或超过了 NeRF 的渲染质…

5个Midjourney技巧,让你的图片更自然真实,没有“AI味”

您是否觉得有些AI生成的图像看起来过于完美&#xff1f;有股AI味&#xff1f;MidJourney 可以创建非常高质量的逼真图像&#xff0c;然而画面完美无瑕、栩栩如生&#xff0c;让人感觉完美得令人不安&#xff0c;几乎不真实。 比如这个&#xff0c;有点夸张&#xff1a; 大多数…

32.3 mmap的在io提速上的应用和prometheus的应用

本节重点总结 : mmap的在io提速上的应用prometheus 中mmap的应用 mmap 减少copy次数 传统IO 在开始谈零拷贝之前&#xff0c;首先要对传统的IO方式有一个概念。基于传统的IO方式&#xff0c;底层实际上通过调用read()和write()来实现。通过read()把数据从硬盘读取到内核缓…