MySQL服務器所支持的最大鏈接數是有上限的,由於每一個鏈接的創建都會消耗內存,所以咱們但願客戶端在鏈接到MySQL Server處理完相應的操做後,應該斷開鏈接並釋放佔用的內存。若是你的MySQL Server有大量的閒置鏈接,他們不只會白白消耗內存,並且若是鏈接一直在累加而不斷開,最終確定會達到MySQL Server的鏈接上限數,這會報'too many connections'的錯誤。因此mysql在必定時長後默認斷開鏈接而且釋放掉sleep的鏈接線程,已保證mysql server不會出現鏈接數過滿的狀況。而tomcat內置/c3p0/dbcp鏈接池則覺得該鏈接依然有效,這種狀況下,如何客戶端代碼向鏈接池獲取鏈接,鏈接池就會把失效的鏈接返回給客戶端代碼,客戶端代碼在使用該失效的鏈接後就會拋出上面的異常。html
mysql默認8小時數據庫斷開的設置參數以下:mysql
1)interactive_timeout:
參數含義:服務器關閉交互式鏈接前等待活動的秒數。交互式客戶端定義爲在mysql_real_connect()中使用CLIENT_INTERACTIVE選項的客戶端。
參數默認值:28800秒(8小時)spring
(2)wait_timeout:
參數含義:服務器關閉非交互鏈接以前等待活動的秒數。
在線程啓動時,根據全局wait_timeout值或全局interactive_timeout值初始化會話wait_timeout值,取決於客戶端類型(由mysql_real_connect()的鏈接選項CLIENT_INTERACTIVE定義)。
參數默認值:28800秒(8小時)sql
ps:若是在配置文件my.cnf中只設置參數wait_timeout=100,則重啓服務器後進入,執行:Mysql> show variables like 「%timeout%」;會發現參數設置並未生效,仍然爲28800(即默認的8個小時)。查詢資料後,要同時設置interactive_timeout和wait_timeout纔會生效。數據庫
復現此問題很容易:設置端口鏈接爲60s便可,而後等待2分鐘後在調一樣的接口並會出現。tomcat
解決思路:springboot
1.既然鏈接8小時會斷開鏈接,能夠設置更長一些好比24小時?不推薦,須要修改mysql自身的配置服務器
2.在數據庫鏈接的URL後面加上autoReconnect=true,聽說是mysql版本5.1以前有效測試
3.修改數據源的鏈接池參數,springboot的修改參數以下url
spring.datasource.mysql.max-idle: '10' spring.datasource.mysql.max-wait: '10000' spring.datasource.mysql.min-idle: '5' spring.datasource.mysql.initial-size: '5'
#mysql的此時鏈接語句 spring.datasource.mysql.validation-query: SELECT 1
#當從鏈接池借用鏈接時,是否測試該鏈接 spring.datasource.mysql.test-on-borrow: 'false'
#當鏈接空閒時,是否執行鏈接測試 spring.datasource.mysql.test-while-idle: 'true'
#指定空閒鏈接檢查、廢棄鏈接清理、空閒鏈接池大小調整之間的操做時間間隔 spring.datasource.mysql.time-between-eviction-runs-millis: '18800'
https://blog.csdn.net/zhanxiaoyun1/article/details/79654668
詳細的參數配置以下