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

Spring Boot 解决数据库宕机的连接重试问题的技术方案

Spring Boot生态中有多个优秀的开源中间件可以解决数据库连接问题。以下是常用的解决方案:

一、连接池层面的解决方案

1.HikariCP(内置,但需要正确配置)

虽然Spring Boot默认使用HikariCP,但需要正确配置才能发挥容错能力:

spring:datasource:hikari:connection-test-query:SELECT 1validation-timeout:5000keepalive-time:60000max-lifetime:600000connection-timeout:30000leak-detection-threshold:60000

2.Druid(阿里连接池)

<dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.20</version></dependency>
spring:datasource:druid:# 连接池配置initial-size:5min-idle:5max-active:20# 连接测试test-on-borrow:truetest-on-return:falsetest-while-idle:truevalidation-query:SELECT 1# 异常重连time-between-eviction-runs-millis:60000min-evictable-idle-time-millis:300000# 过滤器和监控filters:stat,wall,log4j2connection-properties:druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000

二、重试和容错框架

3.Spring Retry(官方)

<dependency><groupId>org.springframework.retry</groupId><artifactId>spring-retry</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency>
@Configuration@EnableRetrypublicclassRetryConfig{}@ServicepublicclassUserService{@Retryable(value={DataAccessException.class,SQLException.class},maxAttempts=3,backoff=@Backoff(delay=1000,multiplier=2))publicUsergetUser(Longid){returnuserRepository.findById(id).orElse(null);}@RecoverpublicUserrecover(DataAccessExceptione,Longid){returnnewUser();// 降级处理}}

4.Resilience4j(轻量级容错库)

<dependency><groupId>io.github.resilience4j</groupId><artifactId>resilience4j-spring-boot2</artifactId><version>2.1.0</version></dependency>
resilience4j:circuitbreaker:instances:databaseService:registerHealthIndicator:trueslidingWindowSize:100failureRateThreshold:50waitDurationInOpenState:60spermittedNumberOfCallsInHalfOpenState:10automaticTransitionFromOpenToHalfOpenEnabled:truerecordExceptions:-org.springframework.dao.DataAccessException-java.sql.SQLException
@ServicepublicclassDatabaseService{@CircuitBreaker(name="databaseService",fallbackMethod="fallback")publicList<User>getUsers(){returnuserRepository.findAll();}publicList<User>fallback(Exceptione){returnnewArrayList<>();}}

三、数据源动态切换和故障转移

5.dynamic-datasource-spring-boot-starter(MyBatis-Plus官方)

<dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>3.6.1</version></dependency>
spring:datasource:dynamic:primary:masterstrict:falsedatasource:master:url:jdbc:mysql://localhost:3306/masterusername:rootpassword:123456slave_1:url:jdbc:mysql://localhost:3306/slave1username:rootpassword:123456slave_2:url:jdbc:mysql://localhost:3306/slave2username:rootpassword:123456hikari:connection-test-query:SELECT 1validation-timeout:5000max-lifetime:600000
@Service@DS("slave")// 使用从库publicclassUserServiceImplimplementsUserService{@Override@DS("master")// 强制使用主库publicvoidaddUser(Useruser){// 写操作}}

6.sharding-jdbc(分布式数据库中间件)

<dependency><groupId>org.apache.shardingsphere</groupId><artifactId>sharding-jdbc-spring-boot-starter</artifactId><version>4.1.1</version></dependency>
spring:shardingsphere:datasource:names:ds0,ds1ds0:type:com.zaxxer.hikari.HikariDataSourcedriver-class-name:com.mysql.cj.jdbc.Driverjdbc-url:jdbc:mysql://localhost:3306/db0username:rootpassword:123456ds1:type:com.zaxxer.hikari.HikariDataSourcedriver-class-name:com.mysql.cj.jdbc.Driverjdbc-url:jdbc:mysql://localhost:3306/db1username:rootpassword:123456masterslave:name:msmaster-data-source-name:ds0slave-data-source-names:ds1load-balance-algorithm-type:round_robin

四、缓存降级方案

7.Spring Cache + Redis/Caffeine

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>
@Configuration@EnableCachingpublicclassCacheConfig{@BeanpublicCacheManagercacheManager(){CaffeineCacheManagercacheManager=newCaffeineCacheManager();cacheManager.setCaffeine(Caffeine.newBuilder().maximumSize(500).expireAfterAccess(600,TimeUnit.SECONDS));returncacheManager;}}@ServicepublicclassUserService{@Cacheable(value="users",unless="#result == null")publicUsergetUser(Longid){// 数据库查询returnuserRepository.findById(id).orElse(null);}@CachePut(value="users",key="#user.id")publicUsersaveUser(Useruser){returnuserRepository.save(user);}@CacheEvict(value="users",key="#id")publicvoiddeleteUser(Longid){userRepository.deleteById(id);}}

五、健康检查和监控

8.Spring Boot Actuator

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency>
management:endpoints:web:exposure:include:health,info,metricsendpoint:health:show-details:alwayshealth:db:enabled:trueredis:enabled:true

9.自定义健康检查

@ComponentpublicclassDatabaseHealthChecker{@AutowiredprivateDataSourcedataSource;@Scheduled(fixedDelay=30000)publicvoidcheckDatabase(){try(Connectionconn=dataSource.getConnection()){if(!conn.isValid(3)){// 触发告警notifyAlert("Database connection invalid");}}catch(SQLExceptione){notifyAlert("Database error: "+e.getMessage());}}}

六、完整解决方案推荐

最佳组合方案

<dependencies><!-- 1. 连接池:HikariCP + 正确配置 --><dependency><groupId>com.zaxxer</groupId><artifactId>HikariCP</artifactId></dependency><!-- 2. 重试机制:Spring Retry --><dependency><groupId>org.springframework.retry</groupId><artifactId>spring-retry</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency><!-- 3. 断路器:Resilience4j --><dependency><groupId>io.github.resilience4j</groupId><artifactId>resilience4j-spring-boot2</artifactId><version>2.1.0</version></dependency><!-- 4. 多数据源:dynamic-datasource --><dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>3.6.1</version></dependency><!-- 5. 缓存:Caffeine --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId></dependency><!-- 6. 监控:Actuator --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency></dependencies>

配置文件示例

spring:# 数据源配置datasource:dynamic:primary:masterstrict:falsedatasource:master:url:jdbc:mysql://localhost:3306/master?autoReconnect=trueusername:rootpassword:123456driver-class-name:com.mysql.cj.jdbc.Driverslave:url:jdbc:mysql://localhost:3306/slave?autoReconnect=trueusername:rootpassword:123456driver-class-name:com.mysql.cj.jdbc.Driverhikari:connection-test-query:SELECT 1validation-timeout:5000keepalive-time:60000max-lifetime:600000connection-timeout:30000# 缓存配置cache:type:caffeinecaffeine:spec:maximumSize=500,expireAfterAccess=600s# 重试配置resilience4j:circuitbreaker:instances:databaseService:failure-rate-threshold:50wait-duration-in-open-state:60spermitted-number-of-calls-in-half-open-state:10sliding-window-size:100# 监控配置management:endpoints:web:exposure:include:health,info,metricsendpoint:health:show-details:always

使用示例

@Service@Slf4jpublicclassUserService{@AutowiredprivateUserMapperuserMapper;@AutowiredprivateCacheManagercacheManager;@CircuitBreaker(name="databaseService",fallbackMethod="getUserFromCache")@Retryable(value={DataAccessException.class},maxAttempts=3)@DS("slave")// 读操作使用从库publicUsergetUser(Longid){returnuserMapper.selectById(id);}@DS("master")// 写操作使用主库@Retryable(value={DataAccessException.class},maxAttempts=3)publicvoidsaveUser(Useruser){userMapper.insert(user);// 更新缓存cacheManager.getCache("users").put(user.getId(),user);}// 降级方法privateUsergetUserFromCache(Longid,Exceptione){log.warn("Fallback to cache for user id: {}",id,e);Cachecache=cacheManager.getCache("users");if(cache!=null){Cache.ValueWrapperwrapper=cache.get(id);if(wrapper!=null){return(User)wrapper.get();}}returnnull;}}

总结

这些开源中间件各有特点:

中间件主要功能适用场景
HikariCP连接池、心跳检测基础配置
Druid连接池、监控、防火墙需要监控和SQL防护
Spring Retry重试机制简单重试需求
Resilience4j断路器、限流复杂的容错需求
dynamic-datasource多数据源、读写分离主从架构
sharding-jdbc分库分表、读写分离分布式数据库
Spring Cache缓存降级读多写少场景

推荐组合:HikariCP + Spring Retry + Resilience4j + dynamic-datasource + Caffeine,这个组合能提供完整的数据库容错能力。

http://www.jsqmd.com/news/395646/

相关文章:

  • 数据解码:2026年实力广告品牌选择的五大核心标准 - 2026年企业推荐榜
  • 2026年武汉地区涂料地坪漆服务企业市场观察 - 2026年企业推荐榜
  • 2026年安徽电商代运营服务商综合实力观察 - 2026年企业推荐榜
  • Vite前端项目构建
  • 2026年武汉装饰装修施工团队可靠选择深度解析 - 2026年企业推荐榜
  • 2026年涂料地坪漆施工团队综合评测与选择攻略 - 2026年企业推荐榜
  • 2026年濮阳固体双氧水品牌权威评测与选择指南 - 2026年企业推荐榜
  • 2026年濮阳氧系漂白剂公司深度评估与优选指南 - 2026年企业推荐榜
  • 网盘直链工具全解析:多平台适配与高效下载指南
  • 2026武汉钢构安装服务商综合评测与选型指南 - 2026年企业推荐榜
  • 如何永久保存QQ空间回忆:GetQzonehistory带来的解决方案
  • 星穹铁道高效开荒:三月七小助手5大核心功能解放双手
  • 3个秘诀解决MusicFreePlugins使用难题
  • 2026西安视力矫正中心测评:四家知名机构深度对比与联系方式 - 2026年企业推荐榜
  • 3个精准选择技巧:让3D建模初学者轻松实现高效编辑
  • 颠覆式方案:让PowerPoint完美兼容LaTeX公式的高效插件
  • 音频格式转换完全指南:QMCDecode破解QQ音乐加密文件的技术实践
  • 零基础玩转AI语音转换:AICoverGen开源工具全攻略
  • 5个技巧打造XML编辑高效工作流:从入门到精通
  • 人工智能应用- 人工智能交叉:06.解析蛋白质宇宙
  • 人工智能应用- 人工智能交叉:05. 从 AlphaFold1 到 AlphaFold2
  • 突破VMware限制:unlocker实现macOS虚拟机跨平台兼容完全指南
  • tModLoader自定义命令开发指南:从入门到精通的7个关键步骤
  • 告别剧情拖沓:March7thAssistant让星穹铁道对话跳过更智能高效
  • 如何高效解析Wallpaper Engine资源包?RePKG工具全解析
  • 突破游戏性能瓶颈:sguard_limit系统资源智能管控解决方案
  • 探索NPK文件的奥秘:游戏资源提取工具深度解析
  • 如何突破Steam平台限制?WorkshopDL的全平台模组无缝下载解决方案
  • Bootloader解锁完全指南:华为Kirin设备用户的开源解决方案
  • DLSS Swapper:5步解决游戏DLSS版本适配难题的高效方案