成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

連接池原來這么簡單(一分鐘系列)

開發 開發工具
應網友要求,寫一寫連接池實現細節。

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

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

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

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

(3)交互結束,關閉連接,釋放資源

這個連接是什么呢,通過連接怎么調用下游接口?服務/數據庫/緩存,官方會提供不同語言的Driver、Document、DemoCode來教使用方建立連接與調用接口,以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

這個DBClientConnection就是一個與MongoDB的連接,官方Driver通過它提供了若干API,讓用戶可以對MongoDB進行連接,增刪查改,關閉的操作,從而實現不同的業務邏輯。

[[180745]]

二、為什么需要連接池

當并發量很低的時候,上述偽代碼沒有任何問題,但當服務單機QPS達到幾百、幾千的時候,建立連接connect和銷毀連接close就會成為瓶頸,此時該如何優化?

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

而這個對Array[DBClientConnection]進行維護的數據結構,就是連接池。有了連接池之后,數據庫操作的偽代碼變為:

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

三、連接池核心接口與實現

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

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

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

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

連接池核心數據結構:

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

(2)互斥鎖數組Array lock[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.   } 

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

簡單的連接池管理

可以發現,簡單的連接池管理并不是很復雜,基本原理即如上所述。

四、未盡事宜

上述偽代碼忽略了一些細節,在實現連接池中是需要考慮的:

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

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

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

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

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

(6)負載均衡、故障轉移、服務自動擴容都可以在這一層實現

【本文為51CTO專欄作者“58沈劍”原創稿件,轉載請聯系原作者】

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

責任編輯:趙寧寧 來源: 51CTO專欄
相關推薦

2017-03-30 19:28:26

HBase分布式數據

2018-06-26 05:23:19

線程安全函數代碼

2017-07-06 08:12:02

索引查詢SQL

2022-07-18 06:16:07

單點登錄系統

2020-05-21 19:46:19

區塊鏈數字貨幣比特幣

2017-02-21 13:00:27

LoadAverage負載Load

2018-07-31 16:10:51

Redo Undo數據庫數據

2021-11-02 09:20:23

區塊鏈比特幣架構

2011-02-21 17:48:35

vsFTPd

2018-12-12 22:51:24

Java包裝語言

2020-07-17 07:44:25

云計算邊緣計算IT

2016-09-12 17:28:45

云存儲應用軟件存儲設備

2020-07-09 07:37:06

數據庫Redis工具

2021-12-01 15:18:45

MySQL復制數據庫

2022-11-11 09:41:04

連接池微服務數據庫

2020-06-11 08:04:12

WDMDWDMMWDM

2013-11-15 07:24:50

4G LTE圖解

2015-11-12 10:32:40

GitHub控制系統分布式

2016-12-16 11:05:00

分布式互斥線程

2021-08-06 08:50:45

加密貨幣比特幣區塊鏈
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲国产成人精品女人久久久 | 99精品电影 | 久久亚洲一区二区三 | www成人免费 | 爱爱视频在线观看 | 久久综合伊人 | 国产精品一区在线播放 | 久久久久国产一区二区三区四区 | 四虎成人免费电影 | 成人免费视频观看视频 | 欧美在线视频网站 | 久久久久国产一区二区三区四区 | 久久亚洲国产精品 | 夜夜爽99久久国产综合精品女不卡 | 久久精品国产a三级三级三级 | 国产伦一区二区三区视频 | 午夜欧美a级理论片915影院 | 成人在线播放 | 国产精品精品久久久久久 | 国内精品久久久久久久 | 亚洲视频在线一区 | 国产精品成人久久久久 | 国产精品久久网 | 天堂网中文字幕在线观看 | 亚洲视频在线观看一区二区三区 | 色偷偷噜噜噜亚洲男人 | 手机av网| 亚洲精品乱码久久久久久按摩 | 综合色播 | 国产精品久久av | 成人妇女免费播放久久久 | 亚洲国产精品va在线看黑人 | 午夜激情网| 久久国产精品视频免费看 | 精品国产乱码久久久久久图片 | 亚洲免费在线观看av | 人人精品| 91麻豆精品国产91久久久更新资源速度超快 | 成年免费大片黄在线观看一级 | 色综合天天天天做夜夜夜夜做 | 国产成人精品免费视频大全最热 |