時間:2007-07-18
來自:http://www.anymobile.org
經常使用的數據一般都會緩存起來,提高效率。對于數據量比較大的,如圖片、資訊類,可以采用緩存Cache+索引的機制處理;而對于比較簡單的數據,可以通過簡單的數據容器進行緩存。當然,它們最終一般都存放在Hashtable 或 HashMap等容器中。
Cache 應用的原理大致是:初始化時將原數據導入Cache中或惰性加載;經常被查詢(點擊率高)的置前;當數據總大小超過Cache容量后,調整容量大小或清理不經常使用(點擊率低)的數據;數據超過有效期,及時清理;對于查詢失敗的數據,需CHECK一下。
簡單的數據容器,將需要緩存的數據保存至單獨的容器,并在一定的條件下進行數據同步。同步的方法大致有2種:啟用一個時間線程,定期集中檢查、處理各個容器的周期同步操作;或者由各個容器單獨維護自身的周期和同步操作。
前者統一處理,不會有額外的開銷,缺點是添加一個新的容器,都需要添加到同步線程中;后者單獨處理,實現起來比較快捷、沒有任何約束,而且互不影響,但使用的時候有額外的處理和對象開銷。
當然,單獨處理并不代表就是所有的業務邏輯都在各容器中控制執行,可以使用代理機制來解決這個問題。
靜態代理:代理對象與被代理的對象都必須實現同一個接口,在代理對象中可以實現CHECK等服務,并在需要的時候再調用被代理的對象,這樣代理對象就只保留業務相關職責。
動態代理:JDK1.3以后開始支持動態代理,處理者的類實現java.lang.ref.InvocationHandler類,可以使用一個處理者(Handler)服務于各個對象。
動態代理相對效率低些,集合靜態代理機制,數據容器大致流程如下:
所有的數據容器都實現Container接口,定義生命周期、同步數據時的時間戳,同步方法和讀取數據的方法;定義一個靜態代理類,在查詢數據的時候,檢查數據容器是否過期,過期則調用容器的同步方法。
類圖如下:
序列圖如下:
樣例代碼如下:
Container container = new StaticProxy( EntityContainer.getInstance() );
int[] arr = (int[]) container.getOne("025");
了解AOP的,很容易就會想到pointcut,advisor,MethodBeforeAdviced等等,原理類似,略。
(全文完)