掃二維碼與項(xiàng)目經(jīng)理溝通
我們在微信上24小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
?服務(wù)連接池,數(shù)據(jù)庫連接池,緩存連接池,連接池是微服務(wù)分層架構(gòu)中不可或缺的一個(gè)組件,本篇講講連接池的原理,以及實(shí)現(xiàn)細(xì)節(jié)。

10年積累的成都網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站設(shè)計(jì)后付款的網(wǎng)站建設(shè)流程,更有溫縣免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
工程架構(gòu)中有很多訪問下游的需求,下游包括但不限于服務(wù)/數(shù)據(jù)庫/緩存,其通訊步驟是為:
不管是服務(wù)/數(shù)據(jù)庫/緩存,官方會(huì)提供不同語言的Driver、Document、DemoCode來指導(dǎo)使用方建立連接與調(diào)用接口。
以MongoDB的C++官方DriverAPI為例:
DBClientConnection* c = new DBClientConnection();
c->connect(“127.0.0.1:8888”);
c->insert(“db.s”, BSON(”shenjian”));
c->close();
畫外音:建立連接、發(fā)送請求、關(guān)閉連接,都非常清晰。
這個(gè)DBClientConnection就是一個(gè)與MongoDB的連接,官方Driver通過它提供了若干API,讓用戶可以對(duì)MongoDB進(jìn)行連接,增刪查改,關(guān)閉的操作,從而實(shí)現(xiàn)不同的業(yè)務(wù)邏輯。
當(dāng)并發(fā)量很低的時(shí)候,連接可以臨時(shí)建立,但當(dāng)服務(wù)吞吐量達(dá)到幾百、幾千的時(shí)候,建立連接connect和銷毀連接close就會(huì)成為瓶頸,此時(shí)該如何優(yōu)化呢?
從而避免反復(fù)的建立和銷毀連接,以提升性能。
而這個(gè)對(duì)Array[DBClientConnection]進(jìn)行維護(hù)的數(shù)據(jù)結(jié)構(gòu),就是連接池。
有了連接池之后,數(shù)據(jù)庫操作的偽代碼變?yōu)椋?/p>
DBClientConnection* c =
ConnectionPool::GetConnection();
c->insert(“db.s”, BSON(”shenjian”));
ConnectionPool::FreeConnection(c);
畫外音:取出連接、發(fā)送請求、放回連接,也非常清晰。
可以看到連接池ConnectionPool主要有三個(gè)核心接口:
連接池至少包含兩個(gè)核心數(shù)據(jù)結(jié)構(gòu):
Init(){
for i = 1 to N {
Array DBClientConnection [i] = new();
Array DBClientConnection [i]->connect();
Array lock[i] = 0;
}
}畫外音:把所有連接和互斥鎖初始化。
GetConnection()
for i = 1 to N {
if(Array lock[i] == 0){
Array lock[i] = 1;
return Array DBClientConnection[i];
}
}
}
畫外音:找一個(gè)可用的連接,鎖住,并返回連接。
FreeConnection(c)
for i = 1 to N {
if(Array DBClientConnection [i] == c){
Array lock[i] = 0;
}
}
}
畫外音:找到連接,把鎖釋放。
會(huì)發(fā)現(xiàn),連接池管理核心并沒有想象的復(fù)雜。
思路比結(jié)論更重要,希望大家有收獲。?

我們在微信上24小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流