程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MYSQL入門知識 >> mysql長連接和短連接概述

mysql長連接和短連接概述

編輯:MYSQL入門知識
 

什麼是長連接?

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

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

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

而長連接通常就是:

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

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

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

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

但是對於服務端來說,長連接也會耗費一定的資源,需要專門的線程(unix下可以用進程管理)來負責維護連接狀態。

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

 

首先,如果使用了長連接而長期沒有對數據庫進行任何操作,那麼在timeout值後,mysql server就會關閉此連接,而客戶端在執行查詢的時候就會得到一個類似於“MySQL server has gone away“這樣的錯誤。

在使用mysql_real_connect連接數據庫之後,再使用mysql_options( &mysql, MYSQL_OPT_RECONNECT, … ) 來設置為自動重連。這樣當mysql連接丟失的時候,使用mysql_ping能夠自動重連數據庫。如果是在mysql 5.1.6之前,那麼則應在每次執行完real_connect 之後執行mysql_options( &mysql, MYSQL_OPT_RECONNECT, … ) ,如果是mysql 5.1.6+,則在connect之前執行一次就夠了。

 

查看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中讀取新的變量值。

 

下邊是一段示例代碼:

if(!mysql_real_connect(&logdb, my_hostname, my_user, my_password, my_dbname, my_port, my_sock, 0)){
ast_log(LOG_ERROR, “Failed to connect to mysql database %s on %s.\n”, my_dbname, my_hostname);
use_mysql = 0;
} else {
char value = 1;
mysql_options(&logdb, MYSQL_OPT_RECONNECT, (char*)&value);
use_mysql = 1;
}

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved