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

Springboot项目中使用druid实现多数据源和动态数据源,因数据库不可用导致的项目挂起的处理方案

Springboot项目中使用druid因数据库不可用导致的项目挂起的处理方案

在Spring Boot项目中使用Druid实现多数据源和动态数据源管理是一个常见的场景。通过合理的配置和错误处理机制,您可以有效地管理数据源,避免因数据库不可用而导致整个项目挂起。
在这里插入图片描述

1. 配置多数据源

application.ymlapplication.properties中配置多个数据源信息:

spring:datasource:dynamic:primary: masterdatasource:master:url: jdbc:mysql://localhost:3306/master_dbusername: rootpassword: passworddriver-class-name: com.mysql.cj.jdbc.Driverslave:url: jdbc:mysql://localhost:3306/slave_dbusername: rootpassword: passworddriver-class-name: com.mysql.cj.jdbc.Driver

2. 动态数据源配置

创建动态数据源配置类,通过@Primary注解标记主要数据源,并使用Druid数据源实现:

@Configuration
public class DynamicDataSourceConfig {@Bean@Primarypublic DataSource dataSource(DynamicDataSourceProperties dynamicDataSourceProperties) {DruidDataSource dataSource = new DruidDataSource();DynamicRoutingDataSource dynamicRoutingDataSource = new DynamicRoutingDataSource();Map<Object, Object> dataSourceMap = new HashMap<>();dataSourceMap.put("master", dataSource);dataSourceMap.put("slave", createDataSource(dynamicDataSourceProperties.getDatasource().get("slave")));dynamicRoutingDataSource.setDefaultTargetDataSource(dataSource);dynamicRoutingDataSource.setTargetDataSources(dataSourceMap);return dynamicRoutingDataSource;}private DataSource createDataSource(Map<String, String> dataSourceProperties) {DruidDataSource dataSource = new DruidDataSource();dataSource.setUrl(dataSourceProperties.get("url"));dataSource.setUsername(dataSourceProperties.get("username"));dataSource.setPassword(dataSourceProperties.get("password"));dataSource.setDriverClassName(dataSourceProperties.get("driver-class-name"));return dataSource;}
}

3. 处理数据库不可用的场景

当数据库不可用时,Druid默认的重试机制可能导致应用程序在连接失败后挂起。为避免这种情况,可以配置Druid的数据源,使其在获取连接失败后立即返回错误,而不是无限制地重试。

spring:datasource:dynamic:datasource:master:druid:break-after-acquire-failure: trueconnection-error-retry-attempts: 0slave:druid:break-after-acquire-failure: trueconnection-error-retry-attempts: 0

配置说明:

  • break-after-acquire-failure: 设置为true,表示在获取连接失败后,立即中断获取过程。
  • connection-error-retry-attempts: 设置为0,表示不进行重试操作。

4. 实现动态数据源切换

通过使用@DS注解,您可以在运行时动态切换数据源。例如:

@Service
public class MyService {@DS("slave")public void useSlaveDataSource() {// 使用从库的业务逻辑}@DS("master")public void useMasterDataSource() {// 使用主库的业务逻辑}
}

5. 总结

通过以上步骤,您可以在Spring Boot项目中成功实现多数据源和动态数据源的管理,并且有效处理因数据库不可用而导致的项目挂起问题。配置Druid的break-after-acquire-failureconnection-error-retry-attempts可以确保在数据库连接失败时,应用程序不会进入无休止的重试状态,从而提高项目的健壮性和可维护性。

http://www.lryc.cn/news/426114.html

相关文章:

  • 多线程 03:知识补充,静态代理与 Lambda 表达式的相关介绍,及其在多线程方面的应用
  • 机器学习中的距离概念
  • Java 如何判断map为null或者空
  • 终端用户视角下的性能测试,体验与度量的融合
  • KCP源码解析系列(二)KCP协议结构体
  • 微软运行库全集合:一站式解决兼容性问题
  • 【 亿邦动力网-注册安全分析报告】
  • 算法笔记|Day26贪心算法IV
  • CVPR2023《DNF: Decouple and Feedback Network for Seeing in the Dark》暗光图像增强论文阅读笔记
  • 大厂进阶七:React状态管理全解析
  • 【ocr识别003】flask+paddleocr+bootstrap搭建OCR文本推理WEB服务
  • 从零开始搭建 LVS 高性能集群 (DR模式)
  • Linux环境开发工具【yum与vim】
  • laravel GuzzleHttp Client 无法获取返回的错误信息
  • XMOS 多路音频解码器
  • XSS小游戏(题目+解析)
  • 《Redis核心技术与实战》学习笔记4——AOF日志:宕机了,Redis如何避免数据丢失?
  • NextJs - 服务端/客户端组件之架构多样性设计
  • 使用 Python 进行 PDF 文件加密
  • Spring Boot集成RabbitMQ
  • OLED屏幕制造工艺流程
  • knowLedge-VueCLI项目中环境变量的定义与使用
  • 【C#】 接口 继承
  • Self-Supervised Learning(李宏毅老师系列)
  • 8月16日笔记
  • 苹果Mac电脑——装macOS和Windows双系统的方法
  • 【C++ 面试 - 基础题】每日 3 题(十五)
  • 数学建模学习笔记
  • 个人可识别信息(PII) AI 去除 API 数据接口
  • 【Python-办公自动化】1秒提取PPT文本内容形成目录保存至WORD