mysql 心跳檢測


MySQL服務器所支持的最大連接數是有上限的,因為每個連接的建立都會消耗內存,因此我們希望客戶端在連接到MySQL Server處理完相應的操作后,應該斷開連接並釋放占用的內存。如果你的MySQL Server有大量的閑置連接,他們不僅會白白消耗內存,而且如果連接一直在累加而不斷開,最終肯定會達到MySQL Server的連接上限數,這會報'too many connections'的錯誤。所以mysql在一定時長后默認斷開連接並且釋放掉sleep的連接線程,已保證mysql server不會出現連接數過滿的情況。而tomcat內置/c3p0/dbcp連接池則以為該連接依然有效,這種情況下,如何客戶端代碼向連接池獲取連接,連接池就會把失效的連接返回給客戶端代碼,客戶端代碼在使用該失效的連接后就會拋出上面的異常。

mysql默認8小時數據庫斷開的設置參數如下:

1)interactive_timeout:
參數含義:服務器關閉交互式連接前等待活動的秒數。交互式客戶端定義為在mysql_real_connect()中使用CLIENT_INTERACTIVE選項的客戶端。
參數默認值:28800秒(8小時)

(2)wait_timeout:
參數含義:服務器關閉非交互連接之前等待活動的秒數。
在線程啟動時,根據全局wait_timeout值或全局interactive_timeout值初始化會話wait_timeout值,取決於客戶端類型(由mysql_real_connect()的連接選項CLIENT_INTERACTIVE定義)。
參數默認值:28800秒(8小時)

ps:如果在配置文件my.cnf中只設置參數wait_timeout=100,則重啟服務器后進入,執行:Mysql> show variables like “%timeout%”;會發現參數設置並未生效,仍然為28800(即默認的8個小時)。查詢資料后,要同時設置interactive_timeout和wait_timeout才會生效。

復現此問題很容易:設置端口連接為60s即可,然后等待2分鍾后在調同樣的接口並會出現。

解決思路:

1.既然連接8小時會斷開連接,可以設置更長一些比如24小時?不推薦,需要修改mysql自身的配置

2.在數據庫連接的URL后面加上autoReconnect=true,據說是mysql版本5.1之前有效

3.修改數據源的連接池參數,springboot的修改參數如下

  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

 詳細的參數配置如下

https://www.cnblogs.com/jianxie/p/3993181.html

https://www.cnblogs.com/asoks/p/5321534.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM