連線池究竟是什麼

2021-09-24 02:53:27 字數 2546 閱讀 7032

通常如何通過連線訪問下游?

工程架構中有很多訪問下游的需求,下游包括但不限於服務/資料庫/快取,其通訊步驟是為:

(1)與下游建立乙個連線;

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

(3)互動結束,關閉連線,釋放資源;

不管是服務/資料庫/快取,官方會提供不同語言的driver、document、democode來指導使用方建立連線與呼叫介面。

以mongodb的c++官方driverapi為例:

dbclientconnection* c = new dbclientconnection();

c->connect(「127.0.0.1:8888」);

c->insert(「db.s」, bson(」shenjian」));

c->close();

畫外音:建立連線、傳送請求、關閉連線,都非常清晰。

這個dbclientconnection就是乙個與mongodb的連線,官方driver通過它提供了若干api,讓使用者可以對mongodb進行連線,增刪查改,關閉的操作,從而實現不同的業務邏輯。

為什麼需要連線池?

當併發量很低的時候,連線可以臨時建立,但當服務吞吐量達到幾百、幾千的時候,建立連線connect和銷毀連線close就會成為瓶頸,此時該如何優化呢?

(1)當服務啟動的時候,先建立好若干連線array[dbclientconnection];

(2)當請求到達的時候,再從array中取出乙個,執行下游操作,執行完放回;

從而避免反覆的建立和銷毀連線,以提公升效能。

而這個對array[dbclientconnection]進行維護的資料結構,就是連線池。

有了連線池之後,資料庫操作的偽**變為:

dbclientconnection* c = 

connectionpool::getconnection();

c->insert(「db.s」, bson(」shenjian」));

connectionpool::freeconnection(c);

畫外音:取出連線、傳送請求、放回連線,也非常清晰。

連線池核心原理與實現是怎麼樣的呢?

可以看到連線池connectionpool主要有三個核心介面:

(1)init:初始化array[dbclientconnection],這個介面只在服務啟動時呼叫一次;

(2)getconnection:請求每次需要訪問資料庫時,不connect乙個新連線,而是通過連線池的這個介面來拿連線;

(3)freeconnection:請求每次訪問完資料庫時,不是close乙個連線,而是把這個連線放回連線池;

連線池核心資料結構是怎樣的呢?

連線池至少包含兩個核心資料結構:

(1)連線陣列array dbclientconnection[n];

(2)互斥鎖陣列array lock[n];

連線池核心介面,是如何通過核心資料結構的操縱,實現連線池功能的呢?

init() }

畫外音:把所有連線和互斥鎖初始化。

getconnection()

for i = 1 to n }

}畫外音:找乙個可用的連線,鎖住,並返回連線。

freeconnection(c)

for i = 1 to n }

}畫外音:找到連線,把鎖釋放。

會發現,連線池管理核心並沒有想象的複雜。

除了核心**,連線池還需要考慮哪些因素呢?

(1)需要實施連線可用性檢測,如果有連線失效,需要重建連線;

(2)通過freearray,connectionmap等資料結構,可以讓取出連線放回連線都達到o(1)時間複雜度;

(3)可以通過hash取連線,實現id序列化;

(4)每條連線被取到的概率必須相同,以實現負載均衡;

(5)如果有下游故障,失效連線必須剔除,以實現故障自動轉移;

(6)如果有下游新增,需要動態擴充連線池,以實現服務自動發現;

Bundle 究竟是什麼?

bundle用於場景 在我印象中比較深刻的是,一般用於activity之間傳遞數值,也用於handler傳送訊息,如下 intent intent new intent bundle bundle new bundle bundle.putstring key value intent.putext...

分析EOF究竟是什麼

eof僅僅是一種狀態或者說條件,需要觸發。read呼叫遇到檔案結尾,觸發該條件,結果將返回0。針對eof,對於標準輸入裝置,普通檔案,管道檔案,網路套接字檔案是read如何觸發呢?下面程式將說明 server.c 是socket套接字服務端,目的為了網路套接字檔案是read如何觸發測試用的。serv...

分析EOF究竟是什麼

eof僅僅是一種狀態或者說條件,需要觸發。read呼叫遇到檔案結尾,觸發該條件,結果將返回0。針對eof,對於標準輸入裝置,普通檔案,管道檔案,網路套接字檔案是read如何觸發呢?下面程式將說明 server.c 是socket套接字服務端,目的為了網路套接字檔案是read如何觸發測試用的。serv...