MySQL 默認 wait_timeout = 28800(8 小時),interactive_timeout = 28800。空閒連接超時後被服務端主動斷開,應用端復用失效連接報錯:Communications link failure / MySQL server has gone away。
-- my.cnf [mysqld]
wait_timeout = 86400
interactive_timeout = 86400
動態生效:
SET GLOBAL wait_timeout = 86400;
SET GLOBAL interactive_timeout = 86400;
使連接池回收機制早於 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 | 主動回收、資源釋放快 | 頻繁創建連接有開銷 | 中低併發、可接受連接建立延遲 |
| 心跳驗證機制 | 連接復用率高、自動剔除失效 | 配置較複雜、需連接池支援 | 生產環境首選、高併發系統 |
wait_timeout = 86400(24h)maxIdleTime = 25200(7h)+ idleConnectionTestPeriod = 18000(5h)+ testConnectionOnCheckout = true