MySQL的連接池花吟、異步、斷線重連

MySQL長連接

MySQL短連接每次請求操作數(shù)據(jù)庫都需要建立與MySQL服務(wù)器建立TCP連接厨姚,這是需要時(shí)間開銷的衅澈。TCP連接需要3次網(wǎng)絡(luò)通信。這樣就增加了一定的延時(shí)和額外的IO消耗遣蚀。請求結(jié)束后會(huì)關(guān)閉MySQL連接矾麻,還會(huì)發(fā)生3/4次網(wǎng)絡(luò)通信。

close操作不會(huì)增加響應(yīng)延時(shí)芭梯,原因是close后是由操作系統(tǒng)自動(dòng)進(jìn)行通信的险耀,應(yīng)用程序感知不到

長連接就可以避免每次請求都創(chuàng)建連接的開銷,節(jié)省了時(shí)間和IO消耗玖喘。提升了PHP程序的性能甩牺。

斷線重連

在cli環(huán)境下,PHP程序需要長時(shí)間運(yùn)行累奈,客戶端與MySQL服務(wù)器之間的TCP連接是不穩(wěn)定的贬派。

  • MySQL-Server會(huì)在一定時(shí)間內(nèi)自動(dòng)切斷連接
  • PHP程序遇到空閑期時(shí)長時(shí)間沒有MySQL查詢,MySQL-Server也會(huì)切斷連接回收資源
  • 其他情況澎媒,在MySQL服務(wù)器中執(zhí)行kill process殺掉某個(gè)連接搞乏,MySQL服務(wù)器重啟

這時(shí)PHP程序中的MySQL連接就失效了。如果仍然執(zhí)行mysql_query戒努,就會(huì)報(bào)一個(gè)“MySQL server has gone away”的錯(cuò)誤请敦。程序處理不到就直接遇到致命錯(cuò)誤并退出了。所以PHP程序中需要斷線重連储玫。

有很多人提出了mysql_ping的方案侍筛,每次mysql_query進(jìn)行連接檢測或者定時(shí)連接檢測。這個(gè)方案不是最好的撒穷。原因是

  • mysql_ping需要主動(dòng)偵測連接匣椰,帶來了額外的消耗
  • 定時(shí)執(zhí)行mysql_ping不能解決問題,如剛剛執(zhí)行過mysql_ping檢測之后端礼,連接就關(guān)閉了

最佳的方案是進(jìn)行斷線重連 禽笑。它的原理是:

(Swoole\Coroutine\Mysql和PDO等其他客戶端同理, 此處簡單舉例)

  1. mysql_query執(zhí)行后檢測返回值
  2. 如果mysql_query返回失敗,檢測錯(cuò)誤碼發(fā)現(xiàn)為2006/2013(這2個(gè)錯(cuò)誤表示連接失敻虬隆)蒲每,再執(zhí)行一次mysql_connect
  3. 執(zhí)行mysql_connect后,重新執(zhí)行mysql_query喻括,這時(shí)必然會(huì)成功邀杏,因?yàn)橐呀?jīng)重新建立了連接
  4. 如果mysql_query返回成功,那么連接是有效的唬血,這是一次正常的調(diào)用

MySQL異步

MySQL異步是指將MySQL連接事件驅(qū)動(dòng)化望蜡,這樣就變成了非阻塞IO。數(shù)據(jù)庫操作并不會(huì)阻塞進(jìn)程拷恨,在MySQL-Server返回結(jié)果時(shí)再執(zhí)行對應(yīng)的邏輯脖律。

有幾個(gè)點(diǎn)需要注意一下:

  • 異步MySQL并沒有節(jié)省SQL執(zhí)行的時(shí)間
  • 一個(gè)MySQL連接同時(shí)只能執(zhí)行1個(gè)SQL,如果異步MySQL存在并發(fā)那么必須創(chuàng)建多個(gè)MySQL連接

異步回調(diào)程序中腕侄,異步MySQL并沒有提升性能小泉。異步最大的好處是可以高并發(fā)芦疏,如果并發(fā)1萬個(gè)請求,那么就需要建立1萬個(gè)MySQL連接微姊,這會(huì)給MySQL-Server帶來巨大的壓力酸茴。

MySQL是根據(jù)連接數(shù)分配資源的,一個(gè)連接需要開啟一個(gè)線程兢交。1000連接那么需要維持1000線程才可以薪捍。線程數(shù)量增加后,線程間切換會(huì)占用大量CPU資源
MySQL短連接反而不會(huì)出現(xiàn)此問題配喳,因?yàn)槎踢B接在使用完后就釋放了酪穿。不會(huì)占用MySQL-Server的連接資源

雖然應(yīng)用層代碼使用異步回調(diào)避免了自身的阻塞,實(shí)際上真正的瓶頸是數(shù)據(jù)庫服務(wù)器晴裹。異步MySQL還帶來了額外的編程復(fù)雜度被济,所以除非是特殊場景的需求,否則不建議使用異步MySQL涧团。

如果程序中堅(jiān)持要使用異步溉潭,那么必須是異步MySQL+連接池的形式。超過規(guī)定的MySQL最大連接后少欺,應(yīng)當(dāng)對SQL請求進(jìn)行排隊(duì)喳瓣,而不是創(chuàng)建新連接,避免大量并發(fā)請求導(dǎo)致MySQL服務(wù)器崩潰赞别。

MySQL連接池

連接池是可以有效降低MySQL-Server負(fù)載的畏陕。原理是 連接池使用一個(gè)共享資源的模式,如并發(fā)100個(gè)請求仿滔,實(shí)際上并不是每個(gè)請求的所有時(shí)間都在執(zhí)行SQL查詢惠毁。這樣100個(gè)請求,共享20個(gè)MySQL連接就可以滿足需求了崎页。當(dāng)一個(gè)請求操作完數(shù)據(jù)庫后鞠绰,開始進(jìn)入模板渲染等流程,這時(shí)就會(huì)釋放數(shù)據(jù)庫連接給其他的請求使用飒焦。

連接池僅在超大型應(yīng)用中才有價(jià)值蜈膨。普通的應(yīng)用采用MySQL長連接方案,每個(gè)php-fpm創(chuàng)建一個(gè)MySQL連接牺荠,每臺(tái)機(jī)器開啟100個(gè)php-fpm進(jìn)程翁巍。如果有10臺(tái)機(jī)器,每臺(tái)機(jī)器并發(fā)的請求為100休雌。實(shí)際上只需要?jiǎng)?chuàng)建1000個(gè)MySQL連接就能滿足需求灶壶,數(shù)據(jù)庫的壓力并不大。即使有100臺(tái)機(jī)器杈曲,硬件配置好的存儲(chǔ)服務(wù)器依然可以承受驰凛。

達(dá)到數(shù)百或者數(shù)千臺(tái)應(yīng)用服務(wù)器時(shí)胸懈,MySQL服務(wù)器就需要維持十萬級的連接。這時(shí)數(shù)據(jù)庫的壓力就會(huì)非常大了恰响。連接池技術(shù)就可以派上用場了趣钱,可以大大降低數(shù)據(jù)庫連接數(shù)。

同步阻塞模式

可基于swooleAsyncTask模塊實(shí)現(xiàn)的連接池渔隶,編程簡單羔挡,沒有數(shù)據(jù)同步和鎖的問題洁奈。甚至可以多個(gè)服務(wù)共享連接池间唉。缺點(diǎn)是: 1. 靈活性不如多線程連接池,無法動(dòng)態(tài)增減連接 2. 有一次進(jìn)程間通信的開銷

協(xié)程模式

可使用channel實(shí)現(xiàn)連接池利术。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末呈野,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子印叁,更是在濱河造成了極大的恐慌被冒,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件轮蜕,死亡現(xiàn)場離奇詭異昨悼,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)跃洛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進(jìn)店門率触,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人汇竭,你說我怎么就攤上這事葱蝗。” “怎么了细燎?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵两曼,是天一觀的道長。 經(jīng)常有香客問我玻驻,道長悼凑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任璧瞬,我火速辦了婚禮佛析,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘彪蓬。我一直安慰自己寸莫,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布档冬。 她就那樣靜靜地躺著膘茎,像睡著了一般桃纯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上披坏,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天态坦,我揣著相機(jī)與錄音,去河邊找鬼棒拂。 笑死伞梯,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的帚屉。 我是一名探鬼主播谜诫,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼攻旦!你這毒婦竟也來了喻旷?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤牢屋,失蹤者是張志新(化名)和其女友劉穎且预,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體烙无,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡锋谐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了截酷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片涮拗。...
    茶點(diǎn)故事閱讀 39,834評論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖合搅,靈堂內(nèi)的尸體忽然破棺而出多搀,到底是詐尸還是另有隱情,我是刑警寧澤灾部,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布康铭,位于F島的核電站,受9級特大地震影響赌髓,放射性物質(zhì)發(fā)生泄漏从藤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一锁蠕、第九天 我趴在偏房一處隱蔽的房頂上張望夷野。 院中可真熱鬧,春花似錦荣倾、人聲如沸悯搔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽妒貌。三九已至通危,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間灌曙,已是汗流浹背菊碟。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留在刺,地道東北人逆害。 一個(gè)月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像蚣驼,于是被迫代替她去往敵國和親魄幕。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內(nèi)容