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

MySQL Timeout 參數全解析:連線、閒置、網路、查詢超時設定指南

     編輯:MySQL 資料庫相關知識

核心 Timeout 變數速查表

變數預設範圍說明
connect_timeout10 秒握手階段等待 Client 送連線封包,防惡意佔用連線槽
wait_timeout28800 (8h)Non-interactive (JDBC/連線池)閒置超過此秒數自動斷開,**連線池必須設 maxLifetime < wait_timeout**
interactive_timeout28800 (8h)Interactive (mysql CLI)CLI 閒置斷開時間
net_read_timeout30 秒TCP 讀取Server 等待 Client 傳資料
net_write_timeout60 秒TCP 寫入Server 向 Client 傳資料
long_query_time10 秒慢查詢判定超過此時間記入 Slow Log
innodb_lock_wait_timeout50 秒行鎖等待事務等待鎖超時回滾
lock_wait_timeout31536000 (1年)MDL/表鎖極大值實際近乎不超時

互動 vs 非互動連線

  • Interactive:mysql_real_connect(..., CLIENT_INTERACTIVE),如 mysql CLI、MySQL Workbench
  • Non-interactive:JDBC、PHP PDO、連線池、**預設走 wait_timeout**

啟動時 Session 變數依客戶端類型從對應 Global 變數初始化。

實測驗證

-- 設定互動逾時 1 秒
SET SESSION interactive_timeout = 1;
-- 等待 2 秒再執行查詢 → ERROR 2006 (HY000): MySQL server has gone away

-- 設定非互動逾時 1 秒
SET SESSION wait_timeout = 1;
-- 連線池閒置 2 秒 → 同樣斷開

JDBC 查詢超時:setQueryTimeout

Statement stmt = conn.createStatement();
stmt.setQueryTimeout(60); // 秒
ResultSet rs = stmt.executeQuery("SELECT SLEEP(100);"); // 會在 60 秒拋 SQLException

原理:客戶端啟動 Timer 任務,超時呼叫 stmt.cancel(),**Server 端無感知**。

坑點:設太短 (如 10 秒) 導致正常長查詢被誤殺,建議 ≥ 60 秒或依 P99 調整。

OceanBase / 新世代資料庫差異

OceanBase 支援 **Server 端 Query Timeout**,可中斷單一查詢而**不斷開 Session**,優於 MySQL 客戶端取消機制。

生產環境建議配置

[mysqld]
# 連線池閒置 10 分鐘自動回收
wait_timeout = 600
interactive_timeout = 600

# 網路讀寫 30/60 秒足夠
net_read_timeout = 30
net_write_timeout = 60

# 慢查詢 1 秒
long_query_time = 1
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log

# InnoDB 鎖等待 10 秒快速失敗
innodb_lock_wait_timeout = 10

結語

掌握 wait_timeout (連線池生命週期)、net_read/write_timeout (網路異常)、innodb_lock_wait_timeout (鎖競爭)、JDBC setQueryTimeout (客戶端兜底) 四大維度,即可構建健壯的資料庫連線與查詢超時防護體系。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved