理解連線池

2021-10-09 12:27:16 字數 1543 閱讀 6090

池化技術 (pool) 是一種很常見的程式設計技巧,

在請求量大時能明顯優化應用效能,降低系統頻繁建連的資源開銷

日常工作中常見的有資料庫連線池、執行緒池、攜程池,物件池

它們的特點都是將 「昂貴的」、「費時的」 的資源維護在乙個特定的 「池子」 中,

規定其最小連線數、最大連線數、阻塞佇列等配置,

方便進行統一管理和復用,

通常還會附帶一些探活機制、強制**、監控一類的配套功能。

資料庫連線池負責分配、管理和釋放資料庫連線,

它允許應用程式重複使用乙個現有的資料庫連線,而不是再重新建立乙個;

並且釋放空閒時間超過最大空閒時間的資料庫連線

來避免因為沒有釋放資料庫連線而引起的資料庫連線遺漏。這項技術能明顯提高資料庫操作的效能。

資料庫連線池技術帶來的優勢:

sql.db 通過以下方法來配置maxopen, maxidle 和 maxlifetime。

setmaxopenconns()

setmaxidleconns()

setconnmaxlifetime

()

2.3.1 獲取連線:

分兩種情況:

在有機會獲取連線條件下,又分為兩種情況:

2.3.2 釋放連線:

任何乙個連線使用完畢之後需要歸還給連線池,這也是資料庫連線池實現中比較重要的邏輯,

通常還伴隨著對連線的可靠性檢測,

如果連線異常關閉,那麼不應該繼續還給連線池,而是應該新建乙個連線進行替換。

如果空閒連線池未滿,直接新增進去,並把工作連線池中相應的連線移除;

如果空閒連線池滿了,直接close()掉,並把工作連線池中相應的連線移除。

2.3.3 清理連線:

乙個資料庫連線無法保證長期有效,

例如,mysql 側會強制 kill 掉長時間空閒的連線(8h)。

在 sql.db 中提供了 maxlifetime 選項設定連線被復用的最大時間,

注意這個時間並不是連線空閒時間,

而是從連線建立到這個時間點就會被**,從而保證連線活性。

cpu原因:

單核cpu的計算機也能「同時」執行數百個執行緒,但這只不過是作業系統用時間分片玩的乙個小把戲。

一顆cpu核心同一時刻只能執行乙個執行緒,然後作業系統切換上下文,核心開始執行另乙個執行緒的**,

以此類推。給定一顆cpu核心,其順序執行a和b永遠比通過時間分片「同時」執行a和b要快,

一旦執行緒的數量超過了cpu核心的數量,再增加執行緒數系統就只會更慢,而不是更快。

所以僅從cpu的角度來考慮,設定執行緒數等於cpu核數,能提供最優的效能。

磁碟, 網路原因

磁碟,網路等因素。在i/o等待時間內,執行緒是在「阻塞」著等待磁碟,

此時作業系統可以將那個空閒的cpu核心用於服務其他執行緒,此時就產生了執行緒的切換,

所以,由於執行緒總是在i/o上阻塞,我們可以讓執行緒/連線數比cpu核心多一些,

這樣能夠在同樣的時間內完成更多的工作。

最終合理的連線數:

最大連線數 = ((核心數 * 2) + 有效磁碟數)

mysql連線池 順序 Mysql 連線池

通常,如果我們的服務涉及到mysql的操作,當乙個新的請求進來的時候,可以先連線mysql,使用完之後再斷開連線即可。但這樣做有個弊端,當請求量巨大時,會在瞬間有大量的資料庫連線與斷開操作,這是非常影響 mysql 效能的做法。此時,我們就需要使用mysql連線池。在 python 服務中使用 my...

資料庫連線池理解

1 資料庫連線池中的連線,本質是一種物件,建立連線池,可以減少物件初始化 建立的時間,這個和執行緒池有點類似。都是為了節省建立時間,資源復用。2 和連線池一樣,資料庫連線池建立的一般也有最大,最小值,即最大連線數量 連線池能申請的最大數量,超過了最大數量後,後續申請將加入到佇列中等待 和最小鏈結數量...

資料庫連線池理解

先說一下連線池的作用 1.限定連線的個數,不會導致由於連線過多導致系統執行緩慢或崩潰 2.連線池不需要每次都去建立或銷毀,節約了資源 3.連線池不需要每次都去建立,響應時間快 然後是資料庫連線池的優點執行原理 在我們不使用資料庫連線池的時候,每次訪問資料庫都需要建立連線,使用完成之後需要釋放關閉連線...