mysql開發(fā)理論:搞懂什么是長連接,短連接和連接池

我們已經(jīng)知道給 MySQL 創(chuàng)建用戶時候,需要創(chuàng)建用戶名和允許連接服務(wù)器的主機,這就說明了我們登錄數(shù)據(jù)庫不一定是本地連接,還包括遠程連接,那么當遠程連接時候,那么就需要建立網(wǎng)絡(luò)來進行數(shù)據(jù)通訊。

短連接

短連接就是我們開發(fā)的應(yīng)用程序需要訪問數(shù)據(jù)庫時候,需要建立數(shù)據(jù)連接,執(zhí)行SQL操作,關(guān)閉連接,用 JAVA 中的偽代碼來描述一下這個過程:

conn = session.onpenConnection();
conn.execute('SQL命令');
session.close();

簡單講就是每一次操作數(shù)據(jù)庫,都要執(zhí)行一次上述操作。它的弊端就是:如果網(wǎng)絡(luò)速度不是很理想的情況下,短連接的會消耗大量的系統(tǒng)資源,在生產(chǎn)環(huán)境中,業(yè)務(wù)很多的話,可能 1 秒內(nèi)幾千個連接,如果都是短連接,且 sql 處理慢的話,連接關(guān)閉不及時,那么資源耗盡速度可能發(fā)生在幾分鐘甚至幾秒,所以我們系統(tǒng)不大可能一直是短連接。

長連接

長連接是指我們的程序和數(shù)據(jù)庫連接之后,就一直打開,后面程序來訪問相同數(shù)據(jù)庫就復(fù)用該連接,使用長連接主要是考慮到減少短連接連接的開銷。有資料顯示 Mysql 的連接比其他數(shù)據(jù)庫要快。

目前 PHP 程序連接數(shù)據(jù)庫是默認采用長連接模式,當它要建立連接來訪問數(shù)據(jù)庫時候,PHP 會檢查是否有相同的連接,存在的話就復(fù)用該連接,不存在就新建一個長連接。怎么認為是相同連接呢,其實很簡單,只要用戶名密碼相同,且連接同一個 IP 的主機數(shù)據(jù)庫,就認為相同。從程序來講,作為客戶端,使用長連接可以不用每次都創(chuàng)建連接對象,如果業(yè)務(wù)很繁忙的話,使用長連接時候,程序性能會很高效。但是 PHP 長連接也會導(dǎo)致數(shù)據(jù)庫連接超過閑置,或者內(nèi)存耗盡的問題。需要合理的設(shè)計和優(yōu)化。

但是從服務(wù)器端來看,維持一個連接會占用服務(wù)器內(nèi)存,如果所有程序都是長連接,肯定會有部分連接處于閑置狀態(tài),但是無論什么狀態(tài)連接,都占用內(nèi)存,這會造成服務(wù)器端的資源浪費,也顯得不是很高效。

對于擴展性好的系統(tǒng),往往大部分訪問不需要連接數(shù)據(jù)庫,它們會采用緩存的方式來避免頻繁連接數(shù)據(jù)庫。

連接池

正是因為無論長連接和短連接都有一些弊端,造成創(chuàng)建連接或者維護連接開銷導(dǎo)致所耗資源過多,此時需要增加連接池來改進性能。它是一個預(yù)先創(chuàng)建的連接緩沖池,考慮到某些數(shù)據(jù)進行連接之后,處理時間過長,而不想它閑置,允許給其他線程使用。一般現(xiàn)在的應(yīng)用服務(wù)器都帶有連接池組件,允許應(yīng)用程序,客戶端來連接,應(yīng)用服務(wù)器維護著連接池的整個生命周期。

數(shù)據(jù)庫連接池技術(shù)的思想非常簡單,將數(shù)據(jù)庫連接作為對象存儲在一個Vector對象中,一旦數(shù)據(jù)庫連接建立后,不同的數(shù)據(jù)庫訪問請求就可以共享這些連接,這樣,通過復(fù)用這些已經(jīng)建立的數(shù)據(jù)庫連接,可以克服無論長連接和短連接缺點,極大地節(jié)省系統(tǒng)資源和時間。

寫在最后

在與數(shù)據(jù)庫有關(guān)的應(yīng)用開發(fā)中,數(shù)據(jù)庫連接的管理是一個難點。所以我們要不斷的優(yōu)化連接池的參數(shù)配置,配合性能壓測,達到一個理想的性能指標值。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,663評論 1 32
  • ORA-00001: 違反唯一約束條件 (.) 錯誤說明:當在唯一索引所對應(yīng)的列上鍵入重復(fù)值時,會觸發(fā)此異常。 O...
    我想起個好名字閱讀 5,973評論 0 9
  • 當數(shù)據(jù)庫服務(wù)器和客戶端位于不同的主機時,就需要建立網(wǎng)絡(luò)連接來進行通信??蛻舳吮仨毷褂脭?shù)據(jù)庫連接來發(fā)送命令和接收應(yīng)答...
    張偉科閱讀 686評論 0 1
  • “我的孩子出了問題”這種話不要急著說,因為很可能出問題的是父母。 幾點思考: 1、孩子進入青春期后,不要再把“乖”...
    wan_xia閱讀 377評論 0 0
  • 好多天不看股票帳戶了 因為知道它一直在跌,能有什么辦法呢,即然沒有在能接受的范圍清掉 要么看著它一直綠的,慢慢回血...
    Facethesun99閱讀 278評論 0 0

友情鏈接更多精彩內(nèi)容