池化技術


轉載自:https://blog.csdn.net/syviah/article/details/46550161

一、池化技術 - 簡單點來說,就是提前保存大量的資源,以備不時之需。

對於線程,內存,oracle的連接對象等等,這些都是資源,程序中當你創建一個線程或者在堆上申請一塊內存時,都涉及到很多系統調用,也是非常消耗CPU的,如果你的程序需要很多類似的工作線程或者需要頻繁的申請釋放小塊內存,如果沒有在這方面進行優化,那很有可能這部分代碼將會成為影響你整個程序性能的瓶頸。

池化技術主要有線程池,內存池,連接池,對象池等等,

對象池就是提前創建很多對象,將用過的對象保存起來,等下一次需要這種對象的時候,再拿出來重復使用

(1)線程池

線程池的原理很簡單,類似於操作系統中的緩沖區的概念,它的流程如下:

先啟動若干數量的線程,並讓這些線程都處於睡眠狀態,當客戶端有一個新請求時,就會喚醒線程池中的某一個睡眠線程,讓它來處理客戶端的這個請求,當處理完這個請求后,線程又處於睡眠狀態。

可能你也許會問:為什么要搞得這么麻煩,如果每當客戶端有新的請求時,我就創建一個新的線程不就完了?這也許是個不錯的方法,因為它能使得你編寫代碼相對容易一些,但你卻忽略了一個重要的問題??性能!

一個省級數據大集中的銀行網絡中心,高峰期每秒的客戶端請求並發數超過100,如果為每個客戶端請求創建一個新線程的話,那耗費的CPU時間和內存將是驚人的,如果采用一個擁有200個線程的線程池,那將會節約大量的的系統資源,使得更多的CPU時間和內存用來處理實際的商業應用,而不是頻繁的線程創建與銷毀。

(2)內存池

如何更好的管理在應用程序中內存的使用,同時提高內存使用的效率,這是值得每一個開發人員深思的問題。內存池(Memory pool)提供了一種比較可行的解決方案。首先是創建內存池。這個過程的主要任務是預先分配足夠大的內存,形成一個初步的“內存池”。分配內存,也就是用戶請求內存時,會返回內存池中一塊空閑的內存,並將其標志置為已使用,當然具體細節和方法有很多。釋放內存時,不是真正地調用free或是delete的過程,而是把內存放回內存池的過程。在把內存放入內存池的同時,要把標志位置為空閑。最后在應用程序結束時,要把內存池銷毀。這里主要做的工作就是把內存池中的每一塊內存釋放。

使用內存池的好處:

1、減少了內存碎片的產生。這個可以從創建內存池的過程中看出。我們在創建內存池時,分配的都是一塊塊比較整的內存塊,這樣可以減少內存碎片的產生。

 2、提高了內存的使用效率。這個可以從分配內存和釋放內存的過程中看出。每次的分配與釋放並不是去調用系統提供的函數或是操作符去操作實際的內存,而是在復用內存池中的內存。

缺點:

就是很有可能會造成內存的浪費,原因也很明顯,開始分配了一大塊內存,不是全部都用得到的。

(3)數據庫連接池

連接池比較典型的有oracle的連接池。

  數據庫連接是一種關鍵的有限的昂貴的資源,這一點在多用戶的網頁應用程序中體現得尤為突出。 一個數據庫連接對象均對應一個物理數據庫連接,每次操作都打開一個物理連接,使用完都關閉連接,這樣造成系統的 性能低下。

數據庫連接池的解決方案是在應用程序啟動時建立足夠的數據庫連接,並講這些連接組成一個連接池(簡單說:在一個“池”里放了好多半成品的數據庫聯接對象),由應用程序動態地對池中的連接進行申請、使用和釋放。對於多於連接池中連接數的並發請求,應該在請求隊列中排隊等待。並且應用程序可以根據池中連接的使用率,動態增加或減少池中的連接數。

    連接池技術盡可能多地重用了消耗內存地資源,大大節省了內存,提高了服務器地服務效率,能夠支持更多的客戶服務。通過使用連接池,將大大提高程序運行效率,同時,我們可以通過其自身的管理機制來監視數據庫連接的數量、使用情況等。

    1) 最小連接數是連接池一直保持的數據庫連接,所以如果應用程序對數據庫連接的使用量不大,將會有大量的數據庫連接資源被浪費;

    2) 最大連接數是連接池能申請的最大連接數,如果數據庫連接請求超過此數,后面的數據庫連接請求將被加入到等待隊列中,這會影響之后的數據庫操作。


圖例:

 




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM