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

MySQL 連線逾時斷開異常徹底解決:wait_timeout 原理、連線池驗證、自動重連三大策略

     編輯:MySQL 資料庫相關知識

應用長時間閒置後再次操作資料庫,拋出 Communications link failure / The last packet successfully received ... was 43200 milliseconds ago,根因是 MySQL wait_timeout (預設 8 小時) 切斷閒置連線,而連線池未偵測失效繼續借出舊連線。

核心參數

三大解決策略 (擇一或組合)

策略一:連線池驗證機制 (推薦、治本)


# HikariCP (Spring Boot 2.x 預設)
spring.datasource.hikari.connection-timeout=30000
spring.datasource.hikari.idle-timeout=600000
spring.datasource.hikari.max-lifetime=1800000
spring.datasource.hikari.connection-test-query=SELECT 1
spring.datasource.hikari.validation-timeout=5000

# c3p0 (Hibernate 傳統)
hibernate.c3p0.testConnectionOnCheckout=true
hibernate.c3p0.preferredTestQuery=SELECT 1
hibernate.c3p0.idle_test_period=300

核心:借出連線前執行 SELECT 1 驗證存活,失效則重建。

策略二:縮短應用端存活時間 < MySQL wait_timeout

  • 設定連線池 maxLifetime (Hikari) / maxIdleTime (Druid) 小於 wait_timeout (如 30 分鐘)。
  • 定時回收閒置連線,避免借到已被 Server 斷開的連線。

策略三:JDBC URL 啟用自動重連 (治標、慎用)


jdbc:mysql://host:3306/db?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8

缺點:可能掩蓋事務邊界、導致資料不一致、不支援 XA 事務,生產環境不建議單獨依賴。

最佳實務組合拳

  1. MySQL 端:wait_timeout=7200 (2h) / interactive_timeout=7200。
  2. 連線池端:maxLifetime=1800000 (30min) + connectionTestQuery=SELECT 1。
  3. 應用端:捕獲 SQLTransientConnectionException 重試邏輯 (指數退避)。
  4. 監控:SHOW GLOBAL STATUS LIKE 'Aborted_connects'; 趨勢上升即告警。

連線斷開本質是「雙端生命週期不一致」,以連線池主動驗證為核心、雙端超時配合為輔,可徹底根治。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
參數預設值含義
wait_timeout28800 (8h)非互動式連線閒置超時秒數
interactive_timeout28800互動式連線 (mysql client) 閒置超時
max_allowed_packet4M/64M封包大小上限,過小也會斷線