mysql5.7版本中,先查看超時設置參數,我們這里只關注需要的超時參數,并不是全都講解
show variables like '%timeout%';
connect_timeout
指的是連接過程中握手的超時時間,在5.0.52以后默認為10秒,之前版本默認是5秒,主要是客戶端的參數。
mysql的基本原理應該是有個監聽線程循環接收請求,當有請求來時,創建線程(或者從線程池中取)來處理這
請求。由于mysql連接采用TCP協議,那么之前勢必是需要進行TCP三次握手的。
TCP三次握手成功之后,客戶端進入阻塞,等待服務端的消息。服務端這個時候會創建一個線程(或者從線程池中取一個線程)來處理請求,主要驗證部分包括host和用戶名密碼驗證。host驗證我們比較熟悉,因為在用grant命令授權用戶的時候是有指定host的。
用戶名密碼認證則是服務端先生成一個隨機數發送給客戶端,客戶端用該隨機數和密碼進行多次sha1加密后發送給服務端驗證。如果通過,整個連接握手過程完成
wait_timeout(interactive_timeout)
從文檔上來看wait_timeout和interactive_timeout都是指不活躍的連接超時時間,連接線程啟動的時候wait_timeout會根據是交互模式還是非交互模式被設置為這兩個值中的一個,默認是8個小時。
數據庫重啟
或數據庫空閑連接超過設置的最大timemout時間
導致數據庫會強行斷開已有的鏈接,就會報這個異常。
如果在wait_timeout秒期間內,數據庫連接(java.sql.Connection)一直處于等待狀態,mysql就將該連接關閉。這時,你的Java應用的連接池仍然合法地持有該連接的引用。當用該連接來進行數據庫操作時,就會產生上述錯誤。一般mysql自身連接的等待時間(wait_timeout)缺省為8小時,或者通過命令參數查看
net_read_timeout 和 net_write_timeout
net_read_timeoutmysql服務端從客戶端讀取(接收)數據時,服務端等待客戶端響應的超時時間,當服務端正在從客戶端讀取?數據時,net_read_timeout控制何時超時。對于這個參數,session和global級別并沒有什么特別,session級別只對當前連接生效,global級別只對新?的連接生效。默認值是30S。net_write_timeoutmysql服務端向客戶端寫(發送)數據時,服務端等待客戶端響應的超時時間,當服務端正在寫數據到客戶端?時,net_write_timeout控制何時超時。對于這個參數,session和global級別并沒有什么特別,session級別只對當前連接生效,global級別只對新?的連接生效,默認值是60S。
參考文檔:
mysql 5.7 連接超時參數設置_mysql connecttimeout-CSDN博客
數據庫連接池連接超時報錯 - 知乎