mysql長連接與短連接


什么是長連接?

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

通常的短連接操作步驟是:

連接-》數據傳輸-》關閉連接;

而長連接通常就是:

連接-》數據傳輸-》保持連接-》數據傳輸-》保持連接-》…………-》關閉連接;

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

什么時候用長連接,短連接?

長連接主要用於在少數客戶端與服務端的頻繁通信,因為這時候如果用短連接頻繁通信常會發生Socket出錯,並且頻繁創建Socket連接也是對資源的浪費。

但是對於服務端來說,長連接也會耗費一定的資源,需要專門的線程(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 連接數據庫時, 首先檢查是否有空閒的連接未被使用, 如果有, 則使用這個連接, 而不是進行連接數據庫的操作, 從而節省系統開銷


免責聲明!

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



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