連線池的實現

2022-07-21 05:36:12 字數 1158 閱讀 9466

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

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

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

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

當併發量很低的時候,建立連線和關閉連線的過程是沒問題的,但當服務單機qps達到幾百、幾千的時候,建立連線和銷毀連線就會成為瓶頸,此時如何優化?

結論很簡單,服務啟動的時候,先建立好若干連線array[connection],但有請求過來的時候,從array中取出乙個,執行下游操作,執行完再放回,從而避免反覆的建立和銷毀連線,以提公升效能。

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

通過上面的討論,可以看到連線池connectionpool主要有三個核心介面

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

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

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

連線池核心資料結構

(1)連線資料array[connection]

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

連線池核心介面實現:

init() 

}說明:把所有連線和互斥鎖初始化

getconnection()

for i = 1 to n }}

說明:找乙個可用的連線,鎖住,並返回連線

freeconnection(c)

for i = 1 to n

}}說明:找到連線,把鎖釋放

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

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

(3)為了讓呼叫方更友好,可能還需要包裝一層dao層,讓「連線」對呼叫方都是黑盒的;

(4)通過freearray,connectionmap可以讓取連線和放回連線都達到o(1)時間複雜度;

(5)可以通過hash實現id序列化;

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

JDBC連線池實現

jdbc connection pool 的注意事項有 1.有乙個簡單的函式從連線池中得到乙個 connection。2.close 函式必須將 connection 放回 資料庫連線池。3.當資料庫連線池中沒有空閒的 connection,資料庫連線池必須能夠自動增加 connection 個數。...

Java實現連線池

連線池原理,非常透徹 public class connectionpool catch exception e try catch exception e static catch filenotfoundexception e catch ioexception e 建立乙個資料庫連線池,連線池...

ftp連線池實現

專案中需要用到ftp,經常性的開關會造成極大的開銷,效率比較低。就想封裝乙個ftp連線池,不過遺憾的是沒有找到現成的,只得根據別人提供的思路來實現了。建立若干個ftp連線,然後將這些連線放入阻塞佇列blockingqueue中,每次使用時從佇列中獲取乙個連線,使用完成後將連線重新插入佇列中。實現 o...