“池”機制的兩大核心
- 重用
- 緩衝
統一管理“池”裏的對象(這個不能作爲核心)
。。。。。
【1】“池”機制有個定長的容器。
【2】初始化時容器中存儲有定量的“池”對象(在此用“池”對象統稱“池”中的線程、進程或者鏈接等,下文同)。
【3】程序中需要使用到對象時,可直接通過“池”獲取。
【4】如果“池”容器中有“池”對象時,直接給程序使用。
【5】如果“池”容器中沒有“池”對象,可以創建新對象供程序使用。
【6】創建新對象時可以設置上限。
【7】程序使用完對象,放入“池”中。
【8】如果“池”容器滿了,則可以銷燬多餘的對象。
看起來闊能有點複雜,哈哈不過看下示例促進下理解。O(∩_∩)O
實例
有個“連接池”,池的大小爲100,可支持最大連接數爲500(假定連接程序均使用一秒後退換/銷燬)
【1】
如果有連接池
當每秒有100以內個線程需要使用連接時,程序可以直接取現成的連接,程序運行效率可想而知。如果沒有連接池
當每秒有100以內的線程需要使用連接時,程序需要創建連接100個,程序運行效率很顯然會受影響。描述 | 需要連接數 | 創建連接數 | n秒需要創建總連接次數 |
---|---|---|---|
有連接池 | 100/s | 0 | |
沒有連接池 | 100/s | 100/s | 100*n |
很顯然,沒有連接池需要創建的連接數十分巨大,開銷也不言而喻。反之使用連接池只需要在啓動時創建100個即可,當然需要佔據一部分內存,但是再性能方面的提升是非常大的。
【2】
如果有連接池
當有1000個線程需要使用連接時,程序可以先直接取用100個作爲緩衝,但是還有900個線程五法滿足,可以創建新的連接400個,此時已經提供了500個連接,但是達到了系統創建連接的上限無法再創建新的連接,剩餘500個線程五法滿足,需要添加到等待隊列中等待池中有新的連接時纔可使用。當500個拿到連接的線程用完連接時,依次將連接歸還時,池可以順次將歸還的連接提供給等待隊列中的線程使用。如果沒有連接池
當有1000個線程需要使用連接時,程序需要創建連接500,沒使用完一個連接銷燬後,在創建一個新的連接。描述 | 需要連接數 | 創建連接數 |
---|---|---|
有連接池 | 1000 | |
沒有連接池 | 1000 | 1000 |
有連接池 | 2000 | |
沒有連接池 | 2000 | 2000 |
數據量小的時候看不出來性能的差異,但是如果併發量比較大時,有連接池的程序能夠無論併發量多大都能夠合理的重用連接。而沒有連接池的程序會出現反覆的銷燬和創建。
如有疏漏之處還望及時反饋