一次生产问题:MySQL连接耗尽和死锁

本文讲述了在生产环境中遇到的MySQL连接耗尽和死锁问题。通过调整连接池配置、分析接口耗时及使用线程池优化,解决了连接耗尽问题。对于死锁,通过对代码逻辑的深入审查,发现循环更新导致的可能性,优化了更新逻辑,避免了不必要的更新操作,从而减少了死锁的发生。
摘要由CSDN通过智能技术生成

连接耗尽

一次外部系统后台多线程调用我的服务时,发生了2次问题,第一次是MySQL连接池耗尽,

Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection;

数据库是MySQL,连接池使用HikariPool,相关配置:
spring.datasource.hikari.minimun-idle=10
spring.datasource.hikari.maximun-pool-size=20
spring.datasource.hikari.connection-timeoiut=3000

并发的请求大约耗时500ms,一共4台实例,按照乐观估计,每秒可以处理2*20*4=160个请求,现在外部请求也就10qps,不至于这么脆弱,刚开始hikari连接池特性问题,查阅各项参数指标,想通过提高连接数来解决问题,后来发现集团建议配置值也是这样,只好本地进行压测,将

spring.datasource.hikari.minimun-idle=1
spring.datasource.hikari.maximun-pool-size=1

先来复现一下报错信息,用Jmete压测后很快出现无法获取连接的异常,于是将配置参数还原至生产配置,进行压测,发现几乎没有异常,全部都正常处理,这样看来不是连接配置问题,开始怀疑是Spring在接口结束后没有释放连接,断点后发现在接口结束时,Spring有拦截器释放连接,这里没有问题。于是继续查看生产日志,突然发现耗时很久的接口

  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值