緩衝&緩存&對象池概念的理解

一)、緩衝java

做用:緩解程序上下層之間的性能差別。

1)、當上層組件的性能優於下層組件時加入緩衝機制能夠減小上層組件對下

	   層組件的等待時間。

2)、上層組件不須要等待下層組件接收所有數據,便可返回操做,加快了上

	    層組件的處理速度。

緩衝的應用:

JDK的I/O組件提供了緩衝功能。

例:當對文件進行寫操做時須要從內存中讀取數據寫入到硬盤,此時,文件從

	內存中的讀取速度比寫入硬盤的速度快,此時就出現了上層組件的性能優

	於下層組件的狀況,此時能夠加入緩衝機制BufferInputStream()先將數據

	寫入緩衝區,再將數據寫道硬盤中。

二)、緩存sql

定義:是一塊爲提升系統性能的內存空間。

做用:暫存數據處理結果,並提供下次訪問使用。

應用場景:

數據處理或數據獲取可能會很是耗時,當數據的請求量很大時,頻繁的數據處

理會耗盡cpu資源。

簡單緩存的實現:直接使用HashMap

弊端:

1)、不知道應該什麼時候清理無效數據。

2)、如何防止數據過多致使內存溢出。

基於java的緩存框架:
  1. EHCache: Hibernate默認的數據緩存解決方案。數據庫

  2. OSCache: 由OpenSymphony設計的,能夠緩存任何對象,甚至是緩存 部分JSP頁面,或者Http請求。數組

  3. JBossCache: 由JBoss開發,可用於JBoss集羣間數據共享的緩存框架。緩存

    緩存的應用:建議在頻繁使用且重負載的的函數中加入緩存,以提升它在頻繁調用的性能,能夠根據傳入的參數構建key。框架

    基於動態代理的緩存解決方案:函數

    1).在方法中加入緩存的弊端:緩存組件和業務層代碼緊密耦合,依賴性強。
    1. . 使用動態代理實現緩存好處:在業務層,無需關注對緩存的操做,代碼被徹底獨立並隔離,對一個新的函數方法,加入緩存不會影響原有方法的實現。

三)、對象複用池性能

對象池化:若一個類被頻繁請求使用,則將這個類的實例保存在一個池中,使用時,直接從池中獲取。線程

對象池能夠是一個數組、鏈表或任何集合類。設計

對象池的應用:

1)、線程池:

2)、數據庫鏈接池

普遍使用的數據鏈接池組件:

1)、c3p0鏈接池 2)、ProXool鏈接池

c3p0鏈接池的實現:

Connection con = pool.getConnection()

con的類類型:com.mchange.V2.c3p0.impl.NewProxyConnection

1)、經過數據鏈接池對象調用getConnection獲取數據庫鏈接對象,此時獲得的 Connection對象時一個NewProxyConnection代理對象.

2)、實際的數據庫鏈接對象是在Connection中的一個內部類對象來鏈接獲取的

Object re = f.get()

    re的類類型:com.msql.jdbc.JDBC4Connection

 Field  f =  con.getClass().getDeclaredFiled("inner") //經過反射獲取內部類對象
 Object re = f.get() //獲取實際的數據庫鏈接

結論:當調用con.close()並無真正的關閉數據庫的鏈接,而是將數據庫鏈接放入數據庫鏈接池保存,當用戶第二次調用getConnection時從鏈接池中獲取 鏈接對象。

四)、Jakarta commons Pool對象池組件

Jakarta commons Poll對象池組件由Apache提供。

定義了兩個接口:

ObjectPool(對象池接口)

public interface ObjectPool{
    //從對象池中取一個對象
    T boorowObject();
    //將對象返回給對象池
    void returnObject(T boorowed);
}

PoolableObjectFactory : 對象池管理工廠

public interface PoolableObjectFactory{
    //建立對象,若對象池沒有對象,在borrowObject()時會自動調用
    T MakeObject();
    //在建立對象前使用,激活對象
    void activateObject(T Object);
    //在對象返回對象池時使用
    void passivateObject(T Object);
    //判斷對象是否可用
    void validateObject(T Object);
    //pool.close()對象從對象池中銷燬使用
    void destoryObject(T Object);
}

內置定義了3個對象池

1)、StackObjectPool

使用java.util.Stack來保存對象,能夠指定初始化大小,當空間不夠時,能夠自

     動增加,無可用對象時,能夠自動建立新對象。

2)、GenericObjectPool

通用對象池,能夠設定對象池的容量,可設定無可用對象時,對象池的表現行

    爲(等待或建立新實例),能夠設置對象有效性檢查

3)、softReferenceObjectPool

使用ArrayList保存對象,不保存對象的強引用,只保存對象的弱引用,對對象

數量沒有限制,當沒有對象時會自動建立對象,當內存緊張時,Jvm自動回收

具備弱引用對象。
相關文章
相關標籤/搜索