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

MySQL 5.5+ 連線逾時導致網站無法存取資料庫:根因與兩大解決方案

     編輯:MySQL 資料庫相關知識

MySQL 5.5 之後預設 wait_timeout=28800(8小時),超過此時間無活動連線會被主動斷開,導致應用程式連線池中的連線失效,網站出現「無法連線資料庫」錯誤。本文提供伺服器端設定與 Java Spring 應用端兩大解決方案。

根因分析

  • MySQL 5.5+ 預設 interactive_timeout = wait_timeout = 28800 秒(8小時)
  • 連線閒置超過 8 小時 → MySQL 主動斷開
  • 應用程式連線池不知情,嘗試使用已失效連線 → 報錯
  • 常見錯誤:Communications link failure、Connection reset

方案一:修改 MySQL 伺服器設定(治標)

Linux: 編輯 /etc/my.cnf(或 /etc/mysql/my.cnf)

[mysqld]
interactive_timeout = 28800000
wait_timeout = 28800000

Windows: 編輯 my.ini

[mysqld]
interactive_timeout = 28800000
wait_timeout = 28800000

💡 設為 28800000 秒(8000小時),實質上關閉逾時機制。
⚠️ 修改後**必須重啟 MySQL 服務**生效。

方案二:應用程式端啟用連線驗證(治本,推薦)

以 Java Spring + DBCP/HikariCP 為例,在 applicationContext.xml 或 application.yml 設定:

DBCP 設定

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="validationQuery" value="SELECT 1"/>
    <property name="testOnBorrow" value="true"/>
    <property name="testWhileIdle" value="true"/>
    <property name="timeBetweenEvictionRunsMillis" value="60000"/>
    <property name="minEvictableIdleTimeMillis" value="300000"/>
</bean>

HikariCP 設定(現代標準)

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

關鍵屬性說明

最佳實務建議

  • ✅ **優先採用方案二**:連線池自我管理,不依賴資料庫設定,遷移環境不受影響
  • ✅ 方案一可作為備援,但會增加資料庫維持閒置連線的資源消耗
  • ✅ 監控連線池指標:active、idle、usage
  • ✅ 設定合理的 maxLifetime(如 30 分鐘),主動回收老舊連線
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
屬性作用
validationQuery / connection-test-query借用連線前執行的驗證 SQL(輕量、快速)
testOnBorrow每次從池取連線時驗證
testWhileIdle背景執行緒定期驗證閒置連線
timeBetweenEvictionRunsMillis驗證間隔(毫秒)