首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

SpringMVC + MyBatis + MySQL 運行一段時間後報 EOFException 連接丟失解決

     編輯:程式設計綜合問答

錯誤堆棧關鍵信息

java.io.EOFException: Can not read response from server.
Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost.
at com.mysql.jdbc.MysqlIO.readFully...
at org.apache.ibatis.datasource.pooled.PooledConnection.invoke...

根因分析

數據庫連接池中的連接 空閒超時被 MySQL 服務器主動斷開(默認 wait_timeout=8h),連接池未檢測到失效,借出給業務線程時讀取返回空包,拋出 EOFException。

解決方案

  1. 配置連接池驗證查詢(Druid/HikariCP/DBCP 均支持):
    validationQuery: SELECT 1
    testWhileIdle: true
    timeBetweenEvictionRunsMillis: 60000
  2. 設置連接最大存活時間小於 MySQL wait_timeout:
    maxLifetime: 30 分鐘 (1800000ms)
  3. MySQL 端調大 wait_timeout(不推薦,治標不治本):
    SET GLOBAL wait_timeout=28800;
  4. 使用 autoReconnect=true(不推薦生產):
    jdbc:mysql://...?autoReconnect=true&failOverReadOnly=false

推薦配置

使用 HikariCP(Spring Boot 2.x 默認)並設置:

spring.datasource.hikari.maximum-pool-size=20
spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.idle-timeout=300000
spring.datasource.hikari.max-lifetime=1800000
spring.datasource.hikari.connection-test-query=SELECT 1
spring.datasource.hikari.validation-timeout=5000

此配置可有效避免「連接被服務器斷開而池不知情」的問題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved