Mysql 的 長鏈接? 短鏈接?

什麼是短鏈接?

短鏈接是指程序和數據庫通訊時須要創建鏈接,執行操做後,鏈接關閉。短鏈接簡單來講就是每一次操做數據庫,都要打開和關閉數據庫鏈接,基本步驟是:鏈接 →數據傳輸 →關閉鏈接mysql

什麼是長鏈接?

長鏈接是指程序之間的鏈接在創建以後,就一直打開,被後續程序重用。使用長鏈接的初衷是減小鏈接的開銷,儘管MySQL的鏈接比其餘數據庫要快得多。sql

以PHP程序爲例,當收到一個永久鏈接的請求時,PHP將檢查是否已經存在一個(前面已經開啓了的)相同的永久鏈接。若是存在,則將直接使用這個鏈接;若是不存在,則創建一個新的鏈接。所謂「相同」的鏈接是指用相同的用戶名和密碼到相同主機的鏈接。數據庫

從客戶端的角度來講,使用長鏈接有一個好處,能夠不用每次建立新鏈接,若客戶端對MySQL服務器的鏈接請求很頻繁,永久鏈接將更加高效。對於高併發業務,若是可能會碰到鏈接的衝擊,推薦使用長鏈接或鏈接池。服務器

從服務器的角度來看,狀況則略有不一樣,它能夠節省建立鏈接的開銷,但維持鏈接也是須要內存的。若是濫用長鏈接的話,可能會使用過多的MySQL服務器鏈接。現代的操做系統能夠擁有幾千個MySQL鏈接,但頗有可能絕大部分都是睡眠(sleep)狀態的,這樣的工做方式不夠高效,並且鏈接佔據內存,也會致使內存的浪費。併發

對於擴展性好的站點來講,其實大部分的訪問並不須要鏈接數據庫。若是用戶須要頻繁訪問數據庫,那麼可能會在流量增大的時候產生性能問題,此時長短鏈接都是沒法解決問題的,因此應該進行合理的設計和優化來避免性能問題。運維

若是客戶端和MySQL數據庫之間有鏈接池或Proxy代理,通常在客戶端推薦使用短鏈接。對於長鏈接的使用必定要慎重,不可濫用。若是沒有每秒幾百、上千的新鏈接請求,就不必定須要長鏈接,也沒法從長鏈接中獲得太多好處。在Java語言中,因爲有鏈接池,若是控制得當,則不會對數據庫有較大的衝擊,但PHP的長鏈接可能致使數據庫的鏈接數超過限制,或者佔用過多的內存。高併發

對此,研發工程師、系統運維工程師、DBA須要保持溝通,肯定合理的鏈接策略,千萬不要不假思索就採用長鏈接性能

 

  所有使用長鏈接後,你可能會發現,有些時候 MySQL 佔用內存漲得特別快,這是由於 MySQL 在執行過程當中臨時使用的內存是管理在鏈接對象裏面的。這些資源會在鏈接斷開的時候才釋放。因此若是長鏈接累積下來,可能致使內存佔用太大,被系統強行殺掉(OOM),從現象看就是 MySQL 異常重啓了。怎麼解決這個問題呢?優化

解決方案:

 1. 按期斷開長鏈接。使用一段時間,或者程序裏面判斷執行過一個佔用內存的大查詢後,斷開鏈接,以後要查詢再重連。spa

 2. 若是你用的是 MySQL 5.7 或更新版本,能夠在每次執行一個比較大的操做後,經過執行 mysql_reset_connection 來從新初始化鏈接資源。這個過程不須要重連和從新作權限驗證,可是會將鏈接恢復到剛剛建立完時的狀態。

 

我的總結:

長鏈接主要用於在少數客戶端與服務端的頻繁通訊,由於這時候若是用短鏈接頻繁通訊常會發生Socket出錯,而且頻繁建立Socket鏈接也是對資源的浪費。

 

可是對於服務端來講,長鏈接也會耗費必定的資源,須要專門的線程(unix下能夠用進程管理)來負責維護鏈接狀態。

總之,長鏈接和短鏈接的選擇要視狀況而定。


一、在頻繁的與數據庫服務通訊,而且又非高併發的狀況下,使用長鏈接更合適;
二、太多持久鏈接,大部分是sleep狀態的,或者系統是高併發的,使用短鏈接更合適。

相關文章
相關標籤/搜索