日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
連接池原來這么簡單(一分鐘系列)

一、如何通過連接訪問下游

創(chuàng)新互聯(lián)公司專注于西鄉(xiāng)企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站開發(fā),成都商城網(wǎng)站開發(fā)。西鄉(xiāng)網(wǎng)站建設(shè)公司,為西鄉(xiāng)等地區(qū)提供建站服務(wù)。全流程按需搭建網(wǎng)站,專業(yè)設(shè)計,全程項目跟蹤,創(chuàng)新互聯(lián)公司專業(yè)和態(tài)度為您提供的服務(wù)

工程架構(gòu)中有很多訪問下游的需求,下游包括但不限于服務(wù)/數(shù)據(jù)庫/緩存,其通訊步驟是為:

(1)與下游建立一個連接

(2)通過這個連接,收發(fā)請求

(3)交互結(jié)束,關(guān)閉連接,釋放資源

這個連接是什么呢,通過連接怎么調(diào)用下游接口?服務(wù)/數(shù)據(jù)庫/緩存,官方會提供不同語言的Driver、Document、DemoCode來教使用方建立連接與調(diào)用接口,以MongoDB的C++官方Driver API為例(偽代碼):

 
 
  1. MongoDB的C++官方Driver API為例(偽代碼): 
  2. DBClientConnection* c = new DBClientConnection(); 
  3. c->connect(“127.0.0.1:8888”); 
  4. c->insert(“db.s”, BSON(”shenjian”)); 
  5. c->close(); 

這個DBClientConnection就是一個與MongoDB的連接,官方Driver通過它提供了若干API,讓用戶可以對MongoDB進(jìn)行連接,增刪查改,關(guān)閉的操作,從而實現(xiàn)不同的業(yè)務(wù)邏輯。

二、為什么需要連接池

當(dāng)并發(fā)量很低的時候,上述偽代碼沒有任何問題,但當(dāng)服務(wù)單機(jī)QPS達(dá)到幾百、幾千的時候,建立連接connect和銷毀連接close就會成為瓶頸,此時該如何優(yōu)化?

結(jié)論也很簡單,服務(wù)啟動的時候,先建立好若干連接Array[DBClientConnection],當(dāng)有請求過來的時候,從Array中取出一個,執(zhí)行下游操作,執(zhí)行完再放回,從而避免反復(fù)的建立和銷毀連接,以提升性能。

而這個對Array[DBClientConnection]進(jìn)行維護(hù)的數(shù)據(jù)結(jié)構(gòu),就是連接池。有了連接池之后,數(shù)據(jù)庫操作的偽代碼變?yōu)椋?/p>

 
 
  1. DBClientConnection* c = ConnectionPool::GetConnection(); 
  2. c->insert(“db.s”, BSON(”shenjian”)); 
  3. ConnectionPool::FreeConnection(c); 

三、連接池核心接口與實現(xiàn)

通過上面的討論,可以看到連接池ConnectionPool主要有三個核心接口:

(1)Init:初始化好Array[DBClientConnection],這個接口只在服務(wù)啟動時調(diào)用一次

(2)GetConnection:請求每次需要訪問數(shù)據(jù)庫時,不是connect一個連接,而是通過連接池的這個接口來拿

(3)FreeConnection:請求每次訪問完數(shù)據(jù)庫時,不是close一個連接,而是把這個連接放回連接池

連接池核心數(shù)據(jù)結(jié)構(gòu):

(1)連接數(shù)組Array DBClientConnection [N]

(2)互斥鎖數(shù)組Array lock[N]

連接池核心接口實現(xiàn):

 
 
  1. Init(){ 
  2.  for i = 1 to N { 
  3.   Array DBClientConnection [i] = new(); 
  4.   Array DBClientConnection [i]->connect(); 
  5.   Array lock[i] = 0; 
  6.  } 

說明:把所有連接和互斥鎖初始化

 
 
  1. GetConnection() 
  2.  for i = 1 to N { 
  3.   if(Array lock[i] == 0){ 
  4.    Array lock[i] = 1; 
  5.    return Array DBClientConnection[i]; 
  6.    } 
  7.  } 

說明:找一個可用的連接,鎖住,并返回連接

 
 
  1. FreeConnection(c) 
  2.  for i = 1 to N { 
  3.  if(Array DBClientConnection [i] == c){ 
  4.    Array lock[i] = 0; 
  5.    } 
  6.   } 

說明:找到連接,把鎖釋放

可以發(fā)現(xiàn),簡單的連接池管理并不是很復(fù)雜,基本原理即如上所述。

四、未盡事宜

上述偽代碼忽略了一些細(xì)節(jié),在實現(xiàn)連接池中是需要考慮的:

(1)如果連接全部被占用,是返回失敗,還是讓上游等待

(2)需要實施連接可用性檢測

(3)為了讓調(diào)用方更友好,可能還需要包裝一層DAO層,讓“連接”這個東西對調(diào)用方都是黑盒的

(4)通過freeArray,connectionMap可以讓取連接和放回連接都達(dá)到O(1)時間復(fù)雜度

(5)可以通過hash實現(xiàn)id串行化

(6)負(fù)載均衡、故障轉(zhuǎn)移、服務(wù)自動擴(kuò)容都可以在這一層實現(xiàn)

【本文為專欄作者“58沈劍”原創(chuàng)稿件,轉(zhuǎn)載請聯(lián)系原作者】


新聞標(biāo)題:連接池原來這么簡單(一分鐘系列)
標(biāo)題鏈接:http://www.dlmjj.cn/article/cohohog.html