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

Spring Boot 应用 “Connection is closed” 及 MySQL 空闲超时断开连接解决方案

在使用 Spring Boot + MySQL + HikariCP 的组合时,可能会在生产或测试环境中遭遇类似如下异常信息:

org.springframework.jdbc.UncategorizedSQLException: PreparedStatementCallback; uncategorized SQLException for SQL [SELECT ...]; 
SQL state [null]; error code [0]; Connection is closed; 
nested exception is java.sql.SQLException: Connection is closedorg.springframework.jdbc.UncategorizedSQLException: PreparedStatementCallback; uncategorized SQLException for SQL [SELECT ...];
SQL state [HY000]; error code [4031]; 
The client was disconnected by the server because of inactivity. 
See wait_timeout and interactive_timeout for configuring this behavior.
...
Caused by: java.sql.SQLException: The client was disconnected by the server because of inactivity.

对于初次遇到此类问题的开发者来说,这往往令人困惑:连接池不是已经帮我们管理连接了吗?为什么还会出现连接被关闭的异常?本文将从问题现象出发,深入分析原因,并给出一些行之有效的解决方案,帮助你解决该问题。

问题现象

在一个正常运行的 Spring Boot 应用中,有时在调用数据库查询接口时会突然报出上述错误信息。其典型特征如下:

  1. Connection is closed:表示在执行 SQL 时发现当前使用的数据库连接已经被关闭,无法继续使用。
  2. The client was disconnected by the server because of inactivity:明确指出 MySQL 服务端在无操作的情况下,主动断开了该连接。

从报错信息可知,客户端(即应用侧)认为自己的连接还在池中可用,但当真正执行 SQL 时却发现服务器端已经将连接回收或断开。这通常意味着连接池中的空闲连接在长时间未使用后失效,当再次被应用取用时引发异常。

原因分析

问题的源头在于 数据库空闲连接的超时与连接池管理机制的交互

  1. MySQL 服务端空闲超时机制:MySQL 会针对长时间处于空闲状态的连接进行自动回收。决定这一过程的关键参数是 wait_timeoutinteractive_timeout。如果连接在一段时间(默认通常是8小时)内未发生任何交互,MySQL 就会主动关闭该连接。
  2. 连接池未定期验证连接可用性:虽然使用了 HikariCP 这样优秀的连接池工具,但如果连接池在将连接归还到池中后,没有执行定期的心跳检测或验证查询,那么当这些连接在池中 “沉睡” 超过 MySQL 的超时时间后,它们会在 MySQL 端被关闭,但连接池本身仍认为这条连接是有效的空闲连接。
  3. 连接重用导致的意外报错:当应用再次从连接池取出这条被 MySQL 已断开的连接试图执行查询时,就会触发上述异常。

解决方案

调整 MySQL 服务端的超时参数(可选)

根据实际业务场景,如果长时间的空闲连接是业务特性(例如夜间业务量很低,白天又有高峰请求),可以适当增大 MySQL 的 wait_timeoutinteractive_timeout 来减少连接被过早回收的概率。

SET GLOBAL wait_timeout = 28800;        -- 设置空闲超时为8小时
SET GLOBAL interactive_timeout = 28800; -- 同上

不过,这只是缓解手段,并非最终方案。过度延长空闲时间并不总是明智,因为这会占用数据库资源。

在 HikariCP 层面实施连接保活策略(推荐)

HikariCP 已经为我们提供了对连接健康检查的良好支持。通过适当地配置,它可以定期验证连接是否仍然有效,并在其被回收前主动进行一个类似 “心跳” 的查询。

关键配置项可包括:

  • connection-test-query:用于验证连接有效性的查询,一般为简单的 SELECT 1SELECT 1 FROM DUAL(根据数据库类型决定)。
  • validation-timeout:验证连接可用性的超时时间。
  • keepalive-time(HikariCP 3.4.1+ 提供):为空闲连接添加心跳检测,即使在没有请求使用时,HikariCP 也会周期性地发送校验查询,以防止连接因空闲被断开。

示例配置(application.yml):

spring:datasource:hikari:# 测试连接的查询connection-test-query: SELECT 1# 每5分钟对空闲连接进行一次心跳测试keepalive-time: 300000# 验证连接有效性的超时时间为5秒validation-timeout: 5000# 连接池中的最大连接数(建议 < MySQL max.connections)maximum-pool-size: 100# 最小空闲连接数minimum-idle: 10# 连接在池中存活30分钟后重建,防止意外长连接问题max-lifetime: 1800000# 客户端从池中获取连接的最大等待时间(以毫秒为单位), 超过此时间将抛出异常 30sconnection-timeout: 30000# 启用自动提交模式auto-commit: true# 连接在池中允许空闲的最长时间(毫秒为单位) 10minidle-timeout: 600000# 连接池的名称pool-name: DatebookHikariCP

通过增加 keepalive-timeconnection-test-query 等参数,当连接空闲达到一定时长时,HikariCP 会自动执行一次 “心跳” 查询,确保该连接始终处于活跃状态。如果该连接已被 MySQL 回收,心跳检测会及时发现并主动从池中移除该连接并新建连接,以确保在真正使用时不出故障。

connection-test-query 说明:

HikariCP 在较新版本中会在需要时自动使用 Connection.isValid() 来检测连接,无需手动指定 connection-test-query。如果你的数据库版本和 JDBC 驱动都支持 isValid() 方法,可以考虑去掉 connection-test-query,让 HikariCP 的内置机制发挥作用,从而减少不必要的测试查询开销。

keepalive-time 说明:

上面将 keepalive-time 设置为5分钟(300000 ms)。这会在连接闲置5分钟后对其进行一次心跳检测,以确保其保持可用。如果你的数据库超时时间较长或者系统较为稳定,你也可以适度延长该时间间隔,减少心跳查询的开销。不过,这需要在业务闲置周期和数据库超时策略之间找到平衡点。

maximum-pool-size 与 minimum-idle 说明:

maximum-pool-size: 100minimum-idle: 10 已算是较为通用的配置。但实际最优值要依据你的并发量、数据库负载、服务器资源等多方面因素来定。如果你的系统在高峰期请求量很大,且需要保持较多的“预热”连接,可以适当提高 minimum-idle,这样在高峰来临时连接池能更快提供足够连接。反之,如果系统较少需要瞬时高并发,你可以适当降低 minimum-idle 减少资源占用。

连接寿命与超时时间说明:

max-lifetime: 1800000 (30分钟)和 idle-timeout: 600000 (10分钟) 通常是合理的默认值。max-lifetime 可以确保连接不会在池中永久存在(避免连接状态异常积累),idle-timeout 可以减少长期闲置连接占用资源。根据具体情况可考虑微调。例如,如果数据库 wait_timeout 为8小时,而你每隔5分钟有keepalive,会在连接超时前刷新连接,不见得需要30分钟就重建连接。但此设置能在更长周期内避免意外的连接状态问题。

connection-timeout 说明:

connection-timeout: 30000 ms 表示当请求获取连接超过30秒未成功就抛出异常。这对多数场景足够宽裕,但如果你的系统对请求延迟敏感,希望快速降级,也可稍微缩短该时间。

auto-commit: true 说明:

通常大多数查询和更新操作在 Spring 事务管理下是可以自动提交的。如果你的代码使用事务注解(@Transactional)来控制提交/回滚,这个设置一般没有问题。但请确保应用程序层面事务管理逻辑清晰。

业务侧定期 “热身”(非必要)

在大多数情况下,通过 HikariCP 的保活机制已经足够。如果业务场景特殊,可以在非高峰期通过定期任务(例如定时执行一次简单查询)来保持连接活性。但这通常是冗余且不太优雅的做法。

相关文章:

Spring Boot 应用 “Connection is closed” 及 MySQL 空闲超时断开连接解决方案

在使用 Spring Boot MySQL HikariCP 的组合时&#xff0c;可能会在生产或测试环境中遭遇类似如下异常信息&#xff1a; org.springframework.jdbc.UncategorizedSQLException: PreparedStatementCallback; uncategorized SQLException for SQL [SELECT ...]; SQL state [nu…...

SLF4J框架原理及其实现方案

slf4j 是一个日志规范框架&#xff1b;基本上所有的 JAVA 日志都要实现这个规范&#xff1b;比如&#xff1a;Logback、log4j、log4j2&#xff1b;本文档记载如何实现 slf4j 规范&#xff1b;实现自己的日志框架&#xff1b; slf4j 分为两个部分&#xff0c;其中包含 &#xf…...

代码随想录-算法训练营-番外(图论01:图论理论基础,所有可到达的路径)

day01 图论part01 今日任务:图论理论基础/所有可到达的路径 代码随想录图论视频部分还没更新 https://programmercarl.com/kamacoder/图论理论基础.html#图的基本概念 day01 所有可达路径 邻接矩阵 import java.util.Scanner;import java.util.List;import java.util.ArrayL…...

【JAVA】Java项目实战—Java EE项目:企业资源规划(ERP)系统

在企业管理中&#xff0c;企业资源规划&#xff08;ERP&#xff09;系统是不可或缺的工具。它能够帮助企业高效管理各种资源&#xff0c;包括人力资源、财务资源和库存等。Java作为一种成熟的编程语言&#xff0c;因其跨平台特性、强大的生态系统以及良好的社区支持&#xff0c…...

springboot配置过滤器解决html资源路径和接口路径冲突问题

比如&#xff1a; html文件使用 / 接口路径使用 /api 首先配置文件里肯定配置范围最大的根路径 server:port: 80servlet:context-path: / 过滤器代码 Slf4j public class RequestSeparationFilter implements Filter {Overridepublic void init(FilterConfig filterConfi…...

在IDE中使用Git

我们在开发的时候肯定是经常使用IDE进行开发的&#xff0c;所以在IDE中使用Git也是非常常用的&#xff0c;接下来以IDEA为例&#xff0c;其他的VS code &#xff0c;Pycharm等IDE都是一样的。 在IDEA中配置Git 1.打开IDEA 2.点击setting 3.直接搜索git 如果已经安装了会自…...

【AIGC进阶-ChatGPT提示词副业解析】反向心理学在沟通中的运用:激将法的艺术

引言 在日常沟通和管理中&#xff0c;直接的表达方式并不总能达到预期效果。反向心理学&#xff0c;特别是其中的激将法&#xff0c;作为一种独特的沟通技巧&#xff0c;往往能在看似消极的表达中激发出积极的反应。本文将深入探讨反向心理学中激将法的运用技巧、实施策略及其…...

JeecgBoot passwordChange 任意用户密码重置漏洞复现

0x01 产品简介 Jeecg Boot是一个企业级低代码开发平台,基于前后端分离的架构,融合了SpringBoot、SpringCloud、Ant Design、Vue、Mybatis-plus、Shiro、JWT等多种主流技术,旨在帮助企业快速构建各种应用系统,提高开发效率,降低开发成本。采用最新主流的前后分离框架,使得…...

【智体OS】官方上新发布智体机器人:使用rtrobot智体应用远程控制平衡车机器人

【智体OS】官方上新发布智体机器人&#xff1a;使用rtrobot智体应用远程控制平衡车机器人 dtns.network是一款主要由JavaScript编写的智体世界引擎&#xff08;内嵌了three.js编辑器的定制版-支持以第一视角浏览3D场馆&#xff09;&#xff0c;可以在浏览器和node.js、deno、e…...

Blazor(.razor)+VUE+elementUI适合一起用吗

在实际项目中&#xff0c;将 Blazor&#xff08;.razor&#xff09; 与 Vue.js 和 ElementUI 一起使用是可以实现的&#xff0c;但是否适合取决于你的项目需求、开发团队的技术栈和具体场景。以下是对这种组合的详细分析&#xff1a; 一、适合一起使用的场景 1.1 逐步引入 Bla…...

SpringBoot左脚进门之Maven管理家

一、概念 Maven 是一个项目管理和整合工具。通过对 目录结构和构建生命周期 的标准化&#xff0c; 使开发团队用极少的时间就能够自动完成工程的基础构建配置。 Maven 简化了工程的构建过程&#xff0c;并对其标准化&#xff0c;提高了重用性。 Maven 本地仓库 (Local Reposi…...

188-下翻便携式6U CPCI工控机箱

一、板卡概述 下翻式CPCI便携工控机,系统采用6u cpci背板结构,1个系统槽,7个扩展槽, 满足对携带的需求,可装标准6U8槽CPCI主板,8个扩展槽, 满足客户对空间扩展的需求.可宽温服务的工作产品,15高亮度液晶显示屏,超薄88键笔记本键盘,触摸式鼠标,加固型机箱结构,使它能够适应各种复…...

Ubuntu 挂载目录

1. 临时挂载&#xff08;重启后失效&#xff09; 创建挂载点&#xff1a; $ sudo mkdir -p /work临时挂载磁盘到 work 目录&#xff1a; $ sudo mount /dev/nvme0n1p1 /work验证挂载是否成功&#xff1a; $ df -h /work此方法挂载在系统重启后会失效&#xff0c;需手动重新挂载…...

基于IEEE 802.1Qci的时间敏感网络(TSN)主干架构安全分析及异常检测系统设计

中文标题&#xff1a;基于IEEE 802.1Qci的时间敏感网络&#xff08;TSN&#xff09;主干架构安全分析及异常检测系统设计 英文标题&#xff1a;Security Analysis of the TSN Backbone Architecture and Anomaly Detection System Design Based on IEEE 802.1Qci 作者信息&…...

2024年食堂采购系统源码技术趋势:如何开发智能的供应链管理APP

本篇文章&#xff0c;小编将与大家一同探讨2024年食堂采购系统的技术趋势&#xff0c;并提供开发更智能的供应链管理APP的策略。 一、2024年食堂采购系统的技术趋势 1.人工智能与机器学习的深度应用 在2024年&#xff0c;AI和机器学习在食堂采购系统中的应用将更加普遍。这些…...

zotero安装教程(包括茉莉花插件)

zotero安装教程&#xff08;包括茉莉花插件&#xff09; zotero下载(windows)1-安装 Zotero2-安装 Zotero Connector3-安装浏览器插件--jasminum茉莉花功能&#xff1a;插件下载地址&#xff1a;[https://github.com/search?qjasminum&typerepositories](https://github.c…...

webpack4 - 配置文件分离(详细教程)

webpack根据开发和生成环境一般可以将配置文件拆分&#xff0c;拆分dev和prod两种环境 |- package.json|- /build|- webpack.base.js|- webpack.dev.js|- webpack.prod.js在scripts里修改相应的命令 "dev": "webpack-dev-server --config build/webpack.dev.j…...

MongoDB 分片

MongoDB 分片 MongoDB 分片是一种数据库架构&#xff0c;用于将大量数据分布存储在多个服务器上。这种设计允许数据库扩展&#xff0c;以处理大量数据和高吞吐量操作。分片通过将数据集分割成小块&#xff0c;称为分片&#xff0c;并将这些分片分布到多个服务器上来工作。每个…...

PHP加载MySQL扩展

PHP本身不具备操作MySQL数据库的能力&#xff0c;需要借助PHP操作MySQL的扩展来实现 1、PHP加载MySQL扩展&#xff1a;php.ini文件中 2、PHP中所有的扩展都在ext文件中&#xff0c;需要指定扩展所在路径&#xff1a;extension_dir 3、php.ini 已经被apache加载&#xff0c;所以…...

期末复习-计算机网络篇SCAU

第一章&#xff1a;概述 1.计算机网络的特点&#xff0c;互联网发展的三个阶段 特点&#xff1a;连通性、资源共享 三个阶段&#xff1a; 1969-1990&#xff1a;从单个网络ARPANET向互联网发展 1985-1993&#xff1a;建成了三级结构的互联网 1993-现在&#xff1a;全球范…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

Java 二维码

Java 二维码 **技术&#xff1a;**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf

FTP 客服管理系统 实现kefu123登录&#xff0c;不允许匿名访问&#xff0c;kefu只能访问/data/kefu目录&#xff0c;不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

免费数学几何作图web平台

光锐软件免费数学工具&#xff0c;maths,数学制图&#xff0c;数学作图&#xff0c;几何作图&#xff0c;几何&#xff0c;AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...

宇树科技,改名了!

提到国内具身智能和机器人领域的代表企业&#xff0c;那宇树科技&#xff08;Unitree&#xff09;必须名列其榜。 最近&#xff0c;宇树科技的一项新变动消息在业界引发了不少关注和讨论&#xff0c;即&#xff1a; 宇树向其合作伙伴发布了一封公司名称变更函称&#xff0c;因…...