MySQL為什麼莫名其妙的斷開連線以及解決方案!
前言
最近遇到在將本地的專案部署到伺服器上之後遇到的一個奇怪問題
在部署完成後,網站當時可以正常工作,但是第二天訪問網站的時候卻會遇到一個500 Server Error。
從日誌中可以看出是MySQL資料庫出現了異常
翻譯如下:
最後一個資料包在 83827560 ms 之前被成功接收,最後一個資料包在83827560 ms 之前被成功傳送。比服務的配置引數
wait_timeout
的值要長。
日誌中給出的建議如下
翻譯如下:
你應考慮在程式中進行資料庫操作之前檢驗資料庫連線的有效性或者將資料庫的autoReconnect屬性設定為true來避免這個問題
關於wait_timeout
和autoReconnect下面我們會依次分析介紹!
原因分析
我們進入mysql的命令列查詢超時時間
28800單位是秒轉化成小時就是8小時
看出MySQL的預設設定,當一個連線的空閒時間超過8小時後,MySQL就會斷開該連線
所以發現問題出在如果超過這個wait_timeout
時間(預設是8小時)對資料庫沒有任何操作,那麼MySQL會自動關閉資料庫連線以節省資源
資料庫連線自動斷開的問題確實是在第二天發生了,也就是在一個晚上沒有對資料庫進行操作(顯然超過了8小時)的情況下發生的這個問題
大家用命令show processlist; 可以檢視Sleep狀態的程式Sleep,同時可以看到每個程式Sleep多久了:
下面介紹下解決和最佳化辦法!
解決方法
1.autoReconnect
這個參數列示在mysql超時斷開連線後會自動重新連線
配置的話,只需要在連線mysql的語句寫上autoReconnect=true
jdbc:mysql://127.0.0.1:3306/stock_tweet?autoReconnect=true
下面是MySQL官網對autoReconnect的解釋:
同時可以看到官網不推薦使用這個引數,因為它有一些副作用
具體介紹下:
原有連線上的事務將會被回滾,事務的提交模式將會丟失 原有連線持有的表的鎖將會全部釋放 原有連線關聯的會話Session將會丟失,重新恢復的連線關聯的將會是一個新的會話Session 原有連線定義的使用者變數將會丟失 原有連線定義的預編譯SQL將會丟失 原有連線失效,新的連線恢復後,MySQL將會使用新的記錄行來儲存連線中的效能資料
2.修改配置
涉及到兩個配置引數interactive_timeout和wait_timeout
wait_timeout
指的是mysql在關閉一個非互動的連線之前所要等待的秒數
interactive_time
指的是mysql在關閉一個互動的連線之前所要等待的秒數
對於互動和非互動連線,說得直白一點就是,透過mysql客戶端連線資料庫是互動式連線,透過jdbc連線資料庫是非互動式連線。
配置方法:
1.會話方式
msyql> set global wait_timeout=2880000;
msyql> set global interactive_timeout=2880000;
這種方式只對當前會話生效
2.修改配置檔案方式
修改/etc/my.cnf檔案,在 [mysqld] 節中設定:
之後再重啟下伺服器就好了
注意:
將wait_timeout
這個值設定得大了,可能會導致空閒連線過多。
如果你的MySQL Server有大量的閒置連線,他們不僅會白白消耗記憶體,而且如果連線一直在累加而不斷開,最終肯定會達到MySQL Server的連線上限數,這會報'too many connections'的錯誤。
連線池配置
因為連線池的配置也會影響專案和MySQL的連線,所以也需要對資料庫連線池的一些配置做一定修改
我們以Spring Boot 2.0預設的資料庫連線池HikariCP為例
主要是下面這幾個配置
maximum-pool-size:
最大連線數,超過這個數,新的資料庫訪問執行緒會被阻,預設值:10。
常見的錯誤是設定一個太大的值,連線數多反而效能下降。
參考計算公式是:
#core_count:CPU個數,effective_spindle_count:硬碟個數
connections = ((core_count * 2) + effective_spindle_count)
例如:一個4核,1塊硬碟的伺服器,連線數 = (4 * 2) + 1 = 9,湊個整數,10就可以了。
minimum-idle:
最小的連線數目
max-lifetime:
最大的連線時間,用來設定一個connection在連線池中的存活時間
預設:30分鐘。強烈建議設定比資料庫超時時長少一點(MySQL的wait_timeout
引數一般為8小時)。
idle-timeout:
一個連線idle狀態的最長時間,超時則被釋放
其他引數詳見:
參考:
https://dev.mysql.com/doc/refman/5.7/en/
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70024420/viewspace-2924567/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- CentOS 7 SSH 連線超時自動斷開解決方案CentOS
- MySQL 連線為什麼掛死了?MySql
- MySQL 連線為什麼掛死了MySql
- Percona Toolkit工具連線MySQL 8報錯的解決方案MySql
- navicat連線MySQL8.0.11報2059錯誤的解決方案MySql
- Ubuntu用terminal進行ssh連線,以及擱置一段時間自動斷開問題解決方案Ubuntu
- 無法遠端連線mysql怎麼解決MySql
- mysql遠端連線不上怎麼解決?MySql
- win10系統連線藍芽滑鼠會自動斷開連線的解決方法Win10藍芽
- MySQL不能從外部 連線的解決方法MySql
- SecureCRT 超時自動斷開連線問題解決方法Securecrt
- 電腦連線WiFi容易斷線或速度慢的解決方法 WiFi速度慢怎麼解決?WiFi
- 遠端連線 Mysql 失敗的解決方法MySql
- 【解決方案】- phpmyadmin連線mysql時登入不了,提示mysqli_real_connect()PHPMySql
- 網路連線斷開如何解決 win10系統網路連線經常斷開Win10
- 為大型超市實施無線覆蓋解決方案有什麼好處?
- zblog應用中心連線失敗的解決方案
- pymysql 處理 連線超時最好的解決方案MySql
- win10wifi自動斷開什麼原因_win10wifi自動斷開且無法連線如何解決Win10WiFi
- 為什麼電腦連線不上手機熱點_電腦連不上手機熱點怎麼解決
- navicat無法遠端連線mysql的解決方法MySql
- MySQL不能從外部連線?速看解決MySql
- 為什麼出現OPTIONS?SpringBoot介面跨域解決方案Spring Boot跨域
- 跨域的原因以及解決方案跨域
- 保持ssh的連線不斷開
- 超市無線網路覆蓋最先進的解決方案是什麼
- 綜合體無線網路覆蓋的解決方案有什麼?
- 1204 斷開式連線
- 什麼是TOGAF解決方案? - Anatolii
- 到底什麼是解決方案公司?
- 什麼是 MySQL JDBC 連線池中最高效的連線檢測語句?MySqlJDBC
- 品牌連鎖店無線覆蓋解決方案
- Doris開發手記1:解決蛋疼的MySQL 8.0連線問題MySql
- win10 wifi熱點自動斷開怎麼辦 win10連線wifi熱點總是斷開解決方法Win10WiFi
- 什麼是雲連線?雲學院帶你瞭解華為雲連線知識
- 快取的三大方案以及解決方案快取
- win10系統連線手機熱點頻繁斷開的解決方法Win10
- minikube配置代理:解決方案以及解決思路