MySQL 5.5 之後預設 wait_timeout=28800(8小時),超過此時間無活動連線會被主動斷開,導致應用程式連線池中的連線失效,網站出現「無法連線資料庫」錯誤。本文提供伺服器端設定與 Java Spring 應用端兩大解決方案。
interactive_timeout = wait_timeout = 28800 秒(8小時)Communications link failure、Connection resetLinux: 編輯 /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 設定:
<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>
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
| 屬性 | 作用 |
|---|---|
validationQuery / connection-test-query | 借用連線前執行的驗證 SQL(輕量、快速) |
testOnBorrow | 每次從池取連線時驗證 |
testWhileIdle | 背景執行緒定期驗證閒置連線 |
timeBetweenEvictionRunsMillis | 驗證間隔(毫秒) |