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

連接池居然這么簡單?

精選
數據庫
服務連接池,數據庫連接池,緩存連接池,連接池是微服務分層架構中不可或缺的一個組件,本篇講講連接池的原理,以及實現細節。

?服務連接池,數據庫連接池,緩存連接池,連接池是微服務分層架構中不可或缺的一個組件,本篇講講連接池的原理,以及實現細節。

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

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

  • 與下游建立一個連接;
  • 通過這個連接,收發請求;
  • 交互結束,關閉連接,釋放資源;

不管是服務/數據庫/緩存,官方會提供不同語言的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就會成為瓶頸,此時該如何優化呢?

  • 當服務啟動的時候,先建立好若干連接Array[DBClientConnection];
  • 當請求到達的時候,再從Array中取出一個,執行下游操作,執行完放回;

從而避免反復的建立和銷毀連接,以提升性能。

而這個對Array[DBClientConnection]進行維護的數據結構,就是連接池。

有了連接池之后,數據庫操作的偽代碼變為:

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

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

連接池核心原理與實現是怎么樣的呢?

可以看到連接池ConnectionPool主要有三個核心接口:

  • Init:初始化Array[DBClientConnection],這個接口只在服務啟動時調用一次;
  • GetConnection:請求每次需要訪問數據庫時,不connect一個新連接,而是通過連接池的這個接口來拿連接;
  • FreeConnection:請求每次訪問完數據庫時,不是close一個連接,而是把這個連接放回連接池;

連接池核心數據結構是怎樣的呢?

連接池至少包含兩個核心數據結構:

  • 連接數組Array DBClientConnection[N];
  • 互斥鎖數組Array lock[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;
}
}
}

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

圖片

會發現,連接池管理核心并沒有想象的復雜。

除了核心代碼,連接池還需要考慮哪些因素呢?

  • 需要實施連接可用性檢測,如果有連接失效,需要重建連接;
  • 通過freeArray,connectionMap等數據結構,可以讓取出連接和放回連接都達到O(1)時間復雜度;
  • 可以通過hash取連接,實現id串行化;
  • 每條連接被取到的概率必須相同,以實現負載均衡;
  • 如果有下游故障,失效連接必須剔除,以實現故障自動轉移;
  • 如果有下游新增,需要動態擴充連接池,以實現服務自動發現;

思路比結論更重要,希望大家有收獲。?

責任編輯:趙寧寧 來源: 架構師之路
相關推薦

2022-12-16 08:21:28

連接池Tomcat策略

2017-01-05 14:16:28

連接池數據代碼

2019-12-30 15:30:13

連接池請求PHP

2009-11-03 16:51:04

ADO.NET連接池觀

2011-06-01 13:54:10

MySQL

2011-07-04 10:17:38

JDBC

2018-02-07 16:23:58

連接池內存池AI

2009-09-22 14:52:55

Hibernate p

2009-09-22 16:04:50

Hibernate連接

2009-06-17 16:22:45

Hibernate連接

2010-06-25 10:36:27

Java連接池

2009-06-17 09:59:46

Hibernate 連

2020-02-03 15:15:27

Druid連接池性能超出競品

2009-07-15 11:00:48

proxool連接池

2015-04-27 09:50:45

Java Hibern連接池詳解

2009-12-25 15:38:12

ADO連接池

2009-06-24 07:53:47

Hibernate數據

2024-12-04 15:55:19

2022-07-19 13:51:47

數據庫Hikari連接池

2011-08-09 15:25:14

線程池數據庫連接池
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲 欧美 日韩在线 | 四虎影院欧美 | 久久久久久国产精品 | 国产成人在线免费 | 亚洲一区二区中文字幕 | 精品三级在线观看 | 开操网| 香蕉大人久久国产成人av | 亚洲男人网 | 91国内精品 | 中文字幕视频在线免费 | 日韩一级免费大片 | 国产成人av电影 | 成年人免费看的视频 | 亚洲欧美中文日韩在线v日本 | 中文字幕亚洲一区二区三区 | 国产中文字幕在线 | 日韩精品一区二区在线 | av性色| 日韩欧美在线观看 | 99视频在线免费观看 | 亚洲一区二区在线 | 国产精品美女久久久av超清 | 91av亚洲| 日韩久久久久久 | 天天看片天天干 | 欧美a在线看 | 久久久国产一区 | 99热这里| 欧美性受xxxx | 精品久久久久久亚洲精品 | 午夜网站视频 | 羞羞视频在线观看免费观看 | 在线a视频 | 91精品中文字幕一区二区三区 | 精品一区二区三区视频在线观看 | h视频免费观看 | 99精品欧美一区二区三区 | 久久久精品网站 | 亚洲午夜久久久 | 亚洲精品一区二区在线观看 |