原因分析
我們進入mysql的指令行查詢逾時時間
show variables like '%timeout%';
wait_timeout 28800機關是秒轉化成小時就是8小時,看出MySQL的預設設定,當一個連接配接的空閑時間超過8小時後,MySQL就會斷開該連接配接,是以發現問題出在如果超過這個wait_timeout時間(預設是8小時)對資料庫沒有任何操作,那麼MySQL會自動關閉資料庫連接配接以節省資源。
用指令show processlist; 可以檢視Sleep狀态的程序Sleep,同時可以看到每個程序Sleep多久了
解決方法
1.autoReconnect
這個參數表示在mysql逾時斷開連接配接後會自動重新連接配接
配置的話,隻需要在連接配接mysql的語句寫上autoReconnect=true
url: jdbc:mysql://${MYSQL_HOST:127.0.0.1}:${MYSQL_PORT:6666}/d_20221222?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true
這種方式它有一些副作用
具體介紹下:
- 原有連接配接上的事務将會被復原,事務的送出模式将會丢失
- 原有連接配接持有的表的鎖将會全部釋放
- 原有連接配接關聯的會話Session将會丢失,重新恢複的連接配接關聯的将會是一個新的會話Session
- 原有連接配接定義的使用者變量将會丢失
- 原有連接配接定義的預編譯SQL将會丢失
- 原有連接配接失效,新的連接配接恢複後,MySQL将會使用新的記錄行來存儲連接配接中的性能資料
2.修改配置
涉及到兩個配置參數interactive_timeout和wait_timeout
wait_timeout 指的是mysql在關閉一個非互動的連接配接之前所要等待的秒數
interactive_time 指的是mysql在關閉一個互動的連接配接之前所要等待的秒數
對于互動和非互動連接配接,說得直白一點就是,通過mysql用戶端連接配接資料庫是互動式連接配接,通過jdbc連接配接資料庫是非互動式連接配接。
1.會話方式
配置方法:
set interactive_timeout=28800000;
set wait_timeout=28800000;
這種方式隻對目前會話生效
2.修改配置檔案方式
修改/etc/my.cnf檔案
之後再重新開機下伺服器就好了
注意:
将wait_timeout這個值設定得大了,可能會導緻空閑連接配接過多。
如果你的MySQL Server有大量的閑置連接配接,他們不僅會白白消耗記憶體,而且如果連接配接一直在累加而不斷開,最終肯定會達到MySQL Server的連接配接上限數,這會報'too many connections'的錯誤。