首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 連接空閒超時 8 小時自動斷開的三大解決方案

     編輯:MySQL 資料庫相關知識

問題根因

MySQL 默認 wait_timeout = 28800(8 小時),interactive_timeout = 28800。空閒連接超時後被服務端主動斷開,應用端復用失效連接報錯:Communications link failure / MySQL server has gone away。

方案一:調大 MySQL 端超時參數(治標)

-- my.cnf [mysqld]
wait_timeout = 86400
interactive_timeout = 86400

動態生效:

SET GLOBAL wait_timeout = 86400;
SET GLOBAL interactive_timeout = 86400;
  • 兩參數僅一個生效,取決於連接類型(交互式 vs 非交互式)
  • 建議雙雙設置避免歧義
  • 不可設為 0(系統會強制重置為 1)
  • 推薦 24 小時(86400)或 7 天(604800)

方案二:縮短連接池空閒存活時間(治本)

使連接池回收機制早於 MySQL 超時踢出:


  

Spring 配置:

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <property name="maxIdleTime" value="${cpool.maxIdleTime}"/>
</bean>

方案三:連接池定時驗證/心跳機制(最穩健)



  
  

Spring 配置:

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <property name="preferredTestQuery" value="${cpool.preferredTestQuery}"/>
    <property name="idleConnectionTestPeriod" value="${cpool.idleConnectionTestPeriod}"/>
    <property name="testConnectionOnCheckout" value="${cpool.testConnectionOnCheckout}"/>
</bean>

方案對比與選型建議

方案優點缺點推薦場景
調大 wait_timeout簡單、無代碼變更佔用服務器連接槽、治標不治本快速止血、無法改代碼
縮短 maxIdleTime主動回收、資源釋放快頻繁創建連接有開銷中低併發、可接受連接建立延遲
心跳驗證機制連接復用率高、自動剔除失效配置較複雜、需連接池支援生產環境首選、高併發系統

最佳實踐組合拳

  1. MySQL 端:wait_timeout = 86400(24h)
  2. 連接池:maxIdleTime = 25200(7h)+ idleConnectionTestPeriod = 18000(5h)+ testConnectionOnCheckout = true
  3. 應用層:捕獲斷開異常重試機制
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved