springboot 数据库连接池 driud 连接超时报错Communications link failure 终极解决方案

1、起源

在某一天突然来了一个需求,大量更新一个表的数据,需要时间 50秒以上那种。然后事情就来了,概率报错数据库了解超时或者异常

shell 复制代码
### Error updating database.  Cause: com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure

The last packet successfully received from the server was 6,001 milliseconds ago. The last packet sent successfully to the server was 6,001 milliseconds ago.
### The error may exist in file [D:\java\saiyo\sy-ifm-backend-2023\saiyo-module-mdl\saiyo-module-mdl-biz\target\classes\mapper\admin\shadow\ShadowMapper.xml]
### The error may involve defaultParameterMap
### The error occurred while setting parameters

2、配置

数据库连接池使用以来版本如下

xml 复制代码
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.2.18</version>
</dependency>

2、归源

经过漫长搜索资料之后发现扯淡太多了,回归本质翻到了druid的代码仓库看到了发版历史

connectTimeout和socketTimeout看到这两个扎心的参数,直接天灵盖一凉,坑啊 再往下翻到Druid 1.2.12 终于找到了坑自何处,学艺不精吃了默认配置的亏啊。

3、解决

添加配置如下

yaml 复制代码
druid: # Druid 【连接池】相关的全局配置
  initial-size: 5 # 初始连接数
  min-idle: 5 # 最小连接池数量
  max-active: 20 # 最大连接池数量
  connect-timeout: 10000
  socket-timeout: 1100000

4、druid配置在线地址

5、【另记】mysql 事务等待超时

在MySQL数据库中,事务超时主要涉及到两个参数:innodb_lock_wait_timeoutwait_timeout。这两个参数决定了事务在等待资源或锁定时的最大等待时间。

  1. innodb_lock_wait_timeout:这是InnoDB存储引擎特有的参数,用于定义一个事务在等待行锁时的最大时间。如果在这个时间内事务没有获得所需的锁,它将抛出一个超时错误(例如 "Lock wait timeout exceeded; try restarting transaction")。默认情况下,这个值通常是50秒。
  2. wait_timeout:这个参数定义了非活动连接的超时时间,即如果一个连接在指定的时间内没有任何动作,MySQL服务器将自动关闭这个连接。默认值通常是8小时(28800秒),但这个值可以在全局或会话级别进行调整。
相关推荐
Livingbody29 分钟前
Fast Whisper 语音转文本
后端
程序员岳焱36 分钟前
深度剖析:Spring AI 与 LangChain4j,谁才是 Java 程序员的 AI 开发利器?
java·人工智能·后端
G探险者41 分钟前
《深入理解 Nacos 集群与 Raft 协议》系列五:为什么集群未过半,系统就不可用?从 Raft 的投票机制说起
分布式·后端
G探险者43 分钟前
《深入理解 Nacos 集群与 Raft 协议》系列一:为什么 Nacos 集群必须过半节点存活?从 Raft 协议说起
分布式·后端
G探险者1 小时前
《深入理解 Nacos 集群与 Raft 协议》系列四:日志复制机制:Raft 如何确保提交可靠且幂等
分布式·后端
G探险者1 小时前
《深入理解 Nacos 集群与 Raft 协议》系列三:日志对比机制:Raft 如何防止数据丢失与错误选主
分布式·后端
G探险者1 小时前
《深入理解 Nacos 集群与 Raft 协议》系列二:Raft 为什么要“选主”?选主的触发条件与机制详解
分布式·后端
我的golang之路果然有问题1 小时前
云服务器部署Gin+gorm 项目 demo
运维·服务器·后端·学习·golang·gin
Java水解1 小时前
彻底解决Flask日志重复打印问题:从原理到实践
后端·flask
Nick同学1 小时前
GatewayWorker 使用总结
后端·php