自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

連接池原來(lái)這么簡(jiǎn)單(一分鐘系列)

開(kāi)發(fā) 開(kāi)發(fā)工具
應(yīng)網(wǎng)友要求,寫(xiě)一寫(xiě)連接池實(shí)現(xiàn)細(xì)節(jié)。

一、如何通過(guò)連接訪問(wèn)下游

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

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

(2)通過(guò)這個(gè)連接,收發(fā)請(qǐng)求

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

這個(gè)連接是什么呢,通過(guò)連接怎么調(diào)用下游接口?服務(wù)/數(shù)據(jù)庫(kù)/緩存,官方會(huì)提供不同語(yǔ)言的Driver、Document、DemoCode來(lái)教使用方建立連接與調(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

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

[[180745]]

二、為什么需要連接池

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

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

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

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

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

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

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

(2)GetConnection:請(qǐng)求每次需要訪問(wèn)數(shù)據(jù)庫(kù)時(shí),不是connect一個(gè)連接,而是通過(guò)連接池的這個(gè)接口來(lái)拿

(3)FreeConnection:請(qǐng)求每次訪問(wèn)完數(shù)據(jù)庫(kù)時(shí),不是close一個(gè)連接,而是把這個(gè)連接放回連接池

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

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

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

連接池核心接口實(shí)現(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.  } 

說(shuō)明:把所有連接和互斥鎖初始化

  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.  } 

說(shuō)明:找一個(gè)可用的連接,鎖住,并返回連接

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

說(shuō)明:找到連接,把鎖釋放

簡(jiǎn)單的連接池管理

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

四、未盡事宜

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

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

(2)需要實(shí)施連接可用性檢測(cè)

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

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

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

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

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

戳這里,看該作者更多好文

責(zé)任編輯:趙寧寧 來(lái)源: 51CTO專(zhuān)欄
相關(guān)推薦

2017-03-30 19:28:26

HBase分布式數(shù)據(jù)

2018-07-31 16:10:51

Redo Undo數(shù)據(jù)庫(kù)數(shù)據(jù)

2017-02-21 13:00:27

LoadAverage負(fù)載Load

2020-05-21 19:46:19

區(qū)塊鏈數(shù)字貨幣比特幣

2018-06-26 05:23:19

線程安全函數(shù)代碼

2017-07-06 08:12:02

索引查詢SQL

2022-07-18 06:16:07

單點(diǎn)登錄系統(tǒng)

2021-11-02 09:20:23

區(qū)塊鏈比特幣架構(gòu)

2016-09-12 17:28:45

云存儲(chǔ)應(yīng)用軟件存儲(chǔ)設(shè)備

2018-12-12 22:51:24

Java包裝語(yǔ)言

2020-07-09 07:37:06

數(shù)據(jù)庫(kù)Redis工具

2020-07-17 07:44:25

云計(jì)算邊緣計(jì)算IT

2011-02-21 17:48:35

vsFTPd

2021-12-01 15:18:45

MySQL復(fù)制數(shù)據(jù)庫(kù)

2022-11-11 09:41:04

連接池微服務(wù)數(shù)據(jù)庫(kù)

2015-11-12 10:32:40

GitHub控制系統(tǒng)分布式

2016-12-16 11:05:00

分布式互斥線程

2018-03-27 09:28:33

緩存策略系統(tǒng)

2021-08-06 08:50:45

加密貨幣比特幣區(qū)塊鏈

2020-06-11 08:04:12

WDMDWDMMWDM
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)