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

MySQL连接数不足导致服务异常GetConnectionTimeoutException

文章目录

  • 场景复现
  • 解决方案
    • 一、调整连接数
    • 二、优化程序


场景复现

已经上线正常运行的项目突然很多功能无法使用,查看程序日志发现MySQL报错,异常信息: Could not open JDBC Connection for transaction; nested exception is com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 60000, active 0, maxActive 200。根据报错信息来看是由于数据库连接数不足导致的,当新的请求到来,当前有效连接数超过maxActive连接数再获取连接时,就新来的请求就会处于排队状态, 当 排队时间超过maxWait,就会抛出该异常。解决方案有两种,一种是调大MySQL连接数,另一种就是优化程序。


解决方案

一、调整连接数

MySQL常用连接参数介绍 可通过指令 SHOW VARIABLES LIKE '%connect%'; 和 SHOW VARIABLES LIKE '%timeout%';查看以下内容:

参数名默认值介绍
connect_timeout10用于连接超时时间,单位为秒
max_connect_errors100允许单用户连接错误最大值,超过后在不刷新状态的情况下,禁止再次连接
max_user_connections0用户连接最大限制,默认0表示无限制,遵守总连接数小于等于max_connections
max_connections100MySQL支持的最大连接数
innodb_lock_wait_timeout120事务等待获取资源等待的最长时间,超过这个时间还未分配到资源则抛出异常,单位为秒
innodb_rollback_on_timeoutOFF在MySQL 5.6&5.7中默认值为OFF,当InnoDB默认情况下仅回滚事务超时的最后一条语句。如果innodb_rollback_on_timeout值为ON,则事务超时后将导致InnoDB中止并回滚整个事务
slave_net_timeout60slave网络连接超时时间(当数据库使用主从时使用)

当出现连接数不够时,可以通过指令SHOW VARIABLES LIKE '%max_connections%';查看数据库配置的最大连接数。
在这里插入图片描述
如果您的程序并发较高,但是数据连接数较小,可以通过指令调大连接数或者更改数据库的配置文件my.cnfmax_connections参数。通过指令调大连接数:set global max_connections=1000;将连接数调大到1000。如果您的连接数已经设置到了较大的数量,还是出现连接数不够,那么需要排查程序是否有问题,就是下面的优化程序。


二、优化程序

由于我设置的连接数为2000,并且系统的并发也不高。因此可以推测出是程序上的问题。通过指令SHOW FULL PROCESSLIST;查看MySQL服务器上的所有连接,包括连接ID、用户、主机、当前执行的SQL语句等信息。
在这里插入图片描述 参数分析:

参数名介绍
ID用户登录mysql时,系统分配的"connection_id
USER当前用户
HOST执行该SQL是由哪台机器操作的
DB进程目前连接的数据库
COMMAND当前连接的执行的命令,一般取值为休眠(sleep),查询(query),连接(connect)等
TIME状态持续时间,单位为秒
STATE当前连接的sql语句的状态
INFO当前执行的SQL语句,可以作为程序优化的重要条件

找出time时间过长的语句,再查看当前state状态,如果当前stateUpdating或者Sending data,则表示当前正在执行查询或者修改操作,并且执行时间过长。将INFO里的执行SQL信息拿出来,加上Explain进行分析。大概率是因为SQL查询或者修改效率过低,没走索引导致连接一直被占用,最后出现连接数不够的情况。这种情况一般需要我们优化SQL,增加索引即可解决问题。更多关于show processlist文章可以参考show processlist 史上最全参数详解及解决方案


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

相关文章:

  • 软考76-上午题-【面向对象技术3-设计模式】-创建型设计模式01
  • Matlab 双目相机标定(内置函数)
  • 【博客7.4】缤果Qt5_TWS串口调试助手V2.0 (高级篇)
  • CSS案例-4.padding导航栏练习
  • 5.1.4.2、【AI技术新纪元:Spring AI解码】Llama2 Chat
  • 后台发送GET/POST方法
  • 计算机考研|双非一战135上岸,408经验分享+复盘
  • 低代码与数字化工具:重塑软件开发的新范式
  • 如何使用 ArcGIS Pro 生成TIN
  • 你真的会做抖音小店吗?你做抖店的方法是正确的吗?教学分享
  • ssh免密登陆更换目标主机后无法连接
  • Java获取视频封面图,利用FFmpegFrameGrabber获取视频封面图
  • pycharm @NotNull parameter ‘module‘ of ...
  • Python使用pynput模块后台监控鼠标及按键
  • C语言 扫雷游戏
  • HTML学习:图片格式——超链接
  • 工业级5g路由器使用案例(5g智慧安防解决方案)
  • sentinel熔断降级
  • Redis的安装和部署教程(Windows环境)
  • MNN Session::resize 之流水线编码(五)
  • 2. IS-IS 基础实验
  • Rust 并行库 crossbeam 的 Channel 示例
  • 缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级的理解
  • springcloud gateway
  • JAVA八股day1
  • 探索拓展坞的奥秘:提升电脑接口的无限可能
  • Linux中执行脚本报错(脚本乱码问题)
  • el-table按钮获取当前行元素
  • MySQL数据导入的方式介绍
  • 构建部署_Docker常用命令