連接超時的核心原因是MySQL默認的空閑連接超時時間過長(wait_timeout和interactive_timeout默認8小時)。通過縮短這兩個參數的值,可自動釋放閑置連接,避免因長時間無操作導致的超時。
/etc/my.cnf(或/etc/mysql/mysql.conf.d/mysqld.cnf),在[mysqld] section添加或修改以下內容:[mysqld]
wait_timeout = 600    # 非交互式連接(如程序連接)空閑超時時間(秒)
interactive_timeout = 600  # 交互式連接(如終端登錄)空閑超時時間(秒)
net_read_timeout = 30  # 讀取數據的超時時間(秒,默認30秒,可根據網絡情況調整)
net_write_timeout = 60 # 寫入數據的超時時間(秒,默認60秒,可根據網絡情況調整)
sudo systemctl restart mysqld
SHOW VARIABLES LIKE 'wait_timeout';
SHOW VARIABLES LIKE 'interactive_timeout';
wait_timeout和interactive_timeout需根據應用場景調整(如高頻訪問的應用可設置為300-600秒,低頻訪問的可適當延長),避免頻繁重建連接。網絡延遲、丟包或防火墻攔截是導致連接超時的常見外部因素。
ping命令測試客戶端與MySQL服務器之間的網絡延遲,若延遲過高(如超過100ms),需聯系網絡管理員解決:ping mysql_server_ip
firewalld為例,執行以下命令:sudo firewall-cmd --zone=public --add-port=3306/tcp --permanent  # 開放3306端口
sudo firewall-cmd --reload  # 重新加載防火墻規則
iptables,可執行:sudo iptables -A INPUT -p tcp --dport 3306 -j ACCEPT  # 允許3306端口
sudo service iptables save  # 保存規則(CentOS 7及以上可能使用firewalld)
/etc/my.cnf,在[mysqld] section添加:skip-name-resolve
應用程序的不當連接使用(如未釋放連接、連接池配置不合理)會導致連接泄漏,最終觸發超時。
maximumPoolSize(最大連接數,根據服務器內存調整,如4GB內存可設置為100-200)和connectionTimeout(連接超時時間,如30秒):HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://localhost:3306/dbname");
config.setUsername("username");
config.setPassword("password");
config.setMaximumPoolSize(100);  // 最大連接數
config.setConnectionTimeout(30000);  // 連接超時時間(毫秒)
HikariDataSource dataSource = new HikariDataSource(config);
Connection、Statement和ResultSet對象(使用try-with-resources或finally塊),避免連接泄漏。若應用并發量高,MySQL默認的最大連接數(通常151)可能不足,導致新連接無法建立??赏ㄟ^修改max_connections參數增加最大連接數。
/etc/my.cnf,在[mysqld] section添加或修改:[mysqld]
max_connections = 500  # 根據服務器內存調整(如8GB內存可設置為300-500)
sudo systemctl restart mysqld
SHOW VARIABLES LIKE 'max_connections';
max_connections會占用更多內存(每個連接約占用2-4MB),需結合服務器內存情況調整,避免內存溢出(OOM)。定期監控MySQL連接狀態,排查長期閑置或異常的連接,及時優化應用行為。
SHOW STATUS LIKE 'Threads_connected';  # 當前活躍連接數
SHOW STATUS LIKE 'Max_used_connections';  # 歷史最大連接數
SHOW PROCESSLIST;  # 查看所有連接及執行的SQL
Sleep狀態的連接(如Command列為Sleep,Time列值較大),說明應用未正確釋放連接,需優化連接管理(如使用連接池或修復代碼中的連接泄漏問題)。