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

一妈橄、如何通過連接訪問下游
工程架構中有很多訪問下游的需求讼载,下游包括但不限于服務/數(shù)據庫/緩存痕檬,其通訊步驟是為:
(1)與下游建立一個連接
(2)通過這個連接,收發(fā)請求
(3)交互結束毅该,關閉連接,釋放資源

這個連接是什么呢叹螟,通過連接怎么調用下游接口鹃骂?服務/數(shù)據庫/緩存,官方會提供不同語言的Driver罢绽、Document畏线、DemoCode來教使用方建立連接與調用接口,以MongoDB的C++官方Driver API為例(偽代碼):
DBClientConnection* c = new DBClientConnection();
c->connect(“127.0.0.1:8888”);
c->insert(“db.s”, BSON(”shenjian”));
c->close();

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

二痊银、為什么需要連接池
當并發(fā)量很低的時候抵蚊,上述偽代碼沒有任何問題,但當服務單機QPS達到幾百、幾千的時候贞绳,建立連接connect和銷毀連接close就會成為瓶頸谷醉,此時該如何優(yōu)化?

結論也很簡單冈闭,服務啟動的時候俱尼,先建立好若干連接Array[DBClientConnection],當有請求過來的時候萎攒,從Array中取出一個遇八,執(zhí)行下游操作,執(zhí)行完再放回耍休,從而避免反復的建立和銷毀連接刃永,以提升性能。

這個對Array[DBClientConnection]進行維護的數(shù)據結構羹应,就是連接池揽碘。有了連接池之后,數(shù)據庫操作的偽代碼變?yōu)椋?br> DBClientConnection* c = ConnectionPool::GetConnection();
c->insert(“db.s”, BSON(”shenjian”));
ConnectionPool::FreeConnection(c);

三园匹、連接池核心接口與實現(xiàn)
通過上面的討論雳刺,可以看到連接池ConnectionPool主要有三個核心接口:
(1)Init:初始化好Array[DBClientConnection],這個接口只在服務啟動時調用一次
(2)GetConnection:請求每次需要訪問數(shù)據庫時裸违,不是connect一個連接掖桦,而是通過連接池的這個接口來拿
(3)FreeConnection:請求每次訪問完數(shù)據庫時,不是close一個連接供汛,而是把這個連接放回連接池

連接池核心數(shù)據結構:
(1)連接數(shù)組Array DBClientConnection [N]
(2)互斥鎖數(shù)組Array lock[N]

連接池核心接口實現(xiàn):
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];
}
}
}
說明:找一個可用的連接枪汪,鎖住,并返回連接

FreeConnection(c)
for i = 1 to N {
if(Array DBClientConnection [i] == c){
Array lock[i] = 0;
}
}
}
說明:找到連接怔昨,把鎖釋放

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

四赖捌、未盡事宜
上述偽代碼忽略了一些細節(jié),在實現(xiàn)連接池中是需要考慮的:
(1)如果連接全部被占用矮烹,是返回失敗越庇,還是讓上游等待
(2)需要實施連接可用性檢測
(3)為了讓調用方更友好,可能還需要包裝一層DAO層奉狈,讓“連接”這個東西對調用方都是黑盒的
(4)通過freeArray卤唉,connectionMap可以讓取連接和放回連接都達到O(1)時間復雜度
(5)可以通過hash實現(xiàn)id串行化
(6)負載均衡、故障轉移仁期、服務自動擴容都可以在這一層實現(xiàn)

希望這一分鐘大家有收獲桑驱。
==【完】==
大家可以點擊加入群:283943715java高級交流群**里面有Java高級大牛直播講解知識點 走的就是高端路線(如果你想跳槽換工作 但是技術又不夠 或者工作上遇到了瓶頸 我這里有一個JAVA的免費直播課程 講的是高端的知識點基礎不好的誤入喲 只要你有1-5年的開發(fā)經驗可以加群找我要課堂鏈接 注意:是免費的 沒有開發(fā)經驗誤入哦)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末竭恬,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子熬的,更是在濱河造成了極大的恐慌萍聊,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件悦析,死亡現(xiàn)場離奇詭異,居然都是意外死亡此衅,警方通過查閱死者的電腦和手機强戴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來挡鞍,“玉大人骑歹,你說我怎么就攤上這事∧ⅲ” “怎么了道媚?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長翘县。 經常有香客問我最域,道長,這世上最難降的妖魔是什么锈麸? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任镀脂,我火速辦了婚禮,結果婚禮上忘伞,老公的妹妹穿的比我還像新娘薄翅。我一直安慰自己,他們只是感情好氓奈,可當我...
    茶點故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布翘魄。 她就那樣靜靜地躺著,像睡著了一般舀奶。 火紅的嫁衣襯著肌膚如雪暑竟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天伪节,我揣著相機與錄音光羞,去河邊找鬼。 笑死怀大,一個胖子當著我的面吹牛纱兑,可吹牛的內容都是我干的。 我是一名探鬼主播化借,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼潜慎,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起铐炫,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤垒手,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后倒信,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體科贬,經...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年鳖悠,在試婚紗的時候發(fā)現(xiàn)自己被綠了榜掌。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡乘综,死狀恐怖憎账,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情卡辰,我是刑警寧澤胞皱,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站九妈,受9級特大地震影響反砌,放射性物質發(fā)生泄漏。R本人自食惡果不足惜允蚣,卻給世界環(huán)境...
    茶點故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一于颖、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧嚷兔,春花似錦森渐、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至壶运,卻和暖如春耐齐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蒋情。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工埠况, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人棵癣。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓辕翰,卻偏偏與公主長得像,于是被迫代替她去往敵國和親狈谊。 傳聞我的和親對象是個殘疾皇子喜命,可洞房花燭夜當晚...
    茶點故事閱讀 45,851評論 2 361

推薦閱讀更多精彩內容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理沟沙,服務發(fā)現(xiàn),斷路器壁榕,智...
    卡卡羅2017閱讀 134,715評論 18 139
  • 1. Java基礎部分 基礎部分的順序:基本語法矛紫,類相關的語法,內部類的語法牌里,繼承相關的語法颊咬,異常的語法,線程的語...
    子非魚_t_閱讀 31,665評論 18 399
  • 轉自http://blog.csdn.net/xugangwen/article/details/44811783...
    扎Zn了老Fe閱讀 12,751評論 1 142
  • 在上篇文章《走進公文式學習法》中牡辽,我整理了公文式學習法,有戰(zhàn)友評論說不夠詳細催享,希望看到更加深入的介紹,今天哟绊,我又整...
    linda2021閱讀 3,385評論 0 1
  • 本周讀李笑來老師的文章因妙,對比了一下自己的學習和生活,總結如下: 我之前的確沒有掌握(或者說沒有踐行)“長期”的概念...
    22QQQQ閱讀 547評論 1 1