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

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

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

1. 配置多数据源

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

spring:
  datasource:
    dynamic:
      primary: master
      datasource:
        master:
          url: jdbc:mysql://localhost:3306/master_db
          username: root
          password: password
          driver-class-name: com.mysql.cj.jdbc.Driver
        slave:
          url: jdbc:mysql://localhost:3306/slave_db
          username: root
          password: password
          driver-class-name: com.mysql.cj.jdbc.Driver

2. 动态数据源配置

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

@Configuration
public class DynamicDataSourceConfig {

    @Bean
    @Primary
    public 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: true
            connection-error-retry-attempts: 0
        slave:
          druid:
            break-after-acquire-failure: true
            connection-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可以确保在数据库连接失败时,应用程序不会进入无休止的重试状态,从而提高项目的健壮性和可维护性。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LOVE_DDZ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值