mysql長鏈接與短鏈接

什麼是長鏈接?php

其實長鏈接是相對於一般的短鏈接而說的,也就是長時間保持客戶端與服務端的鏈接狀態。mysql

一般的短鏈接操做步驟是:sql

鏈接-》數據傳輸-》關閉鏈接;數據庫

而長鏈接一般就是:服務器

鏈接-》數據傳輸-》保持鏈接-》數據傳輸-》保持鏈接-》…………-》關閉鏈接;網絡

這就要求長鏈接在沒有數據通訊時,定時發送數據包,以維持鏈接狀態,短鏈接在沒有數據傳輸時直接關閉就好了併發

何時用長鏈接,短鏈接?socket

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

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

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

查看mysql鏈接數

mysqladmin -uroot -p processlist

實際的測試中我發現,當設置了MYSQL_OPT_RECONNECT爲1時,超時後再查看processlist,則自動創建的鏈接不在列表中,但事實上鍊接確實創建並被使用了。

在MYSQL的默認設置中,若是一個數據庫鏈接超過8小時沒有使用(閒置8小時),服務器將斷開這條鏈接,後續在該鏈接上進行的查詢操做都將失敗。網絡上對該問題的描述很是多。也提供了相應的解決辦法。我在這裏提一些我本身的見解。

解決辦法一:修改MYSQL服務器的配置參數

道理很是簡單,MYSQL的默認設置是在數據庫鏈接超過8小時沒有使用後將其斷開,若是咱們將這個時間改爲更大的數值,那麼鏈接超時所需的時間就會更長,也就意味着更不容易超時。網絡上提供的修改方法通常是修改/etc/my.cnf,在這個文件中添加一行wait_timeout=你須要設置的超時時間。實際上有一種比較簡單的方法來修改這個參數:

首先做爲超級用戶登陸到MYSQL,注意必須是超級用戶,不然後面會提示沒有修改權限。而後輸入

show global variables like 'wait_timeout';

回車執行後顯示目前的超時時間:

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| wait_timeout | 28800 |

+---------------+-------+

1 row in set (0.00 sec)

上面顯示的是默認的超時時間,即8個小時(單位是秒)。如今從新設置該參數,例如咱們要將超時時間設置成10個小時,能夠輸入:

set global wait_timeout=36000;

回車執行,顯示:

Query OK, 0 rows affected (0.00 sec)

表示設置成功,能夠從新使用show global variables like 'wait_timeout'來驗證。

這種方法比較直觀,並且設置的參數當即生效。但若是/etc/my.cnf中沒有配置,則重啓服務後,global變量會從/etc/my.cnf中讀取新的變量值。

  譬如 HTTP 的 Connection-alive 若是爲 close,則 server 收到一個 request 併發送完一個 response 以後就會主動關閉鏈接,這就是短鏈接;若是 Connection-alive keep-alive 的話能夠在一個 tcp 鏈接中交換屢次對話。是這個定義?那就只是個程序結構設計問題了。

長鏈接短鏈接只是一個概念性的問題,只要知道其概念,不是一個特殊的東西:
長鏈接:系統通信鏈接創建後就一直保持。
短鏈接:只有系統須要相互發消息鏈接才創建(客戶端發起),請求消息獲得響應後鏈接關閉;
通信實體間使用長鏈接,通常還須要定義心跳消息,按期發送來檢測系統間鏈路是否異常,每隔必定時間發送一次心跳,若是必定次數沒有收到心跳消息,這認爲此鏈接出現問題,須要斷開鏈接從新創建。
具體心跳消息的格式,以及發送間隔,以及多少次沒有收到心跳就認爲鏈路異常,以及數據部是否算做心跳消息(有的系統若是接收到數據包則會清除心跳計時器也就至關於系統中的數據包也算做心跳消息);這個須要兩端進行協商。好比GSM經常使用的短消息中心和其餘網絡實體互連的SMPP協議,要求創建的就是長鏈接.

因此長短鏈接只是一個概念問題長短鏈接的socket,就是使用普通的socket函數,沒有什麼特殊的

數據庫鏈接池由數據庫管理器提供。與鏈接語言無關。php 提供了 pconnect 的機制, 能夠實現連接池的功能 .對於 mysql , mysql_pconnect 函數就能夠實現 :數據庫連接使用完畢後, 並不釋放, 而是留在系統中, 下一次調用 mysql_pconnect 連接數據庫時, 首先檢查是否有空閒的連接未被使用, 若是有, 則使用這個連接, 而不是進行連接數據庫的操做, 從而節省系統開銷

相關文章
相關標籤/搜索