OSCache

OSCache由OpenSymphony設計,它是一種開創性的JSP定製標記套用,提供了在現有JSP頁面之內實現快速記憶體緩衝的功能。

OSCache由OpenSymphony設計,它是一種開創性的JSP定製標記套用,提供了在現有JSP頁面之內實現快速記憶體緩衝的功能。OSCache是個一個廣泛採用的高性能的J2EE快取框架,OSCache能用於任何Java應用程式的普通的快取解決方案。OSCache有以下特點:快取任何對象,你可以不受限制的快取部分jsp頁面或HTTP請求,任何java對象都可以快取。擁有全面的API--OSCache API給你全面的程式來控制所有的OSCache特性。永久快取--快取能隨意的寫入硬碟,因此允許昂貴的創建(expensive-to-create)數據來保持快取,甚至能讓套用重啟。支持集群--集群快取數據能被單個的進行參數配置,不需要修改代碼。快取記錄的過期--你可以有最大限度的控制快取對象的過期,包括可插入式的刷新策略(如果默認性能不需要時)。

OSCache是當前運用最廣的快取方案,JBoss,Hibernate,Spring等都對其有支持,
下面簡單介紹一下OSCache的配置和使用過程。

1.安裝過程

從http://www.opensymphony.com/oscache/download.html下載合適的OSCache版本,
我下載的是oscache-2.0.2-full版本。
解壓縮下載的檔案到指定目錄
從解壓縮目錄取得oscache.jar 檔案放到 /WEB-INF/lib 或相應類庫目錄 目錄中,
jar檔案名稱可能含有版本號和該版本的發布日期信息等,如oscache-2.0.2-22Jan04.jar
如果你的jdk版本為1.3.x,建議在lib中加入Apache Common Lib 的Commons-collections.jar包。
如jdk是1.4以上則不必
從src或etc目錄取得oscache.properties 檔案,放入src根目錄或發布環境的/WEB-INF/classes 目錄
如你需要建立磁碟快取,須修改oscache.properties 中的cache.path信息 (去掉前面的#注釋)。
win類路徑類似為c:\\app\\cache
unix類路徑類似為/opt/myapp/cache
拷貝OSCache標籤庫檔案oscache.tld到/WEB-INF/classes目錄。
現在你的套用目錄類似如下:
$WEB_APPLICATION\WEB-INF\lib\oscache.jar
$WEB_APPLICATION\WEB-INF\classes\oscache.properties
$WEB_APPLICATION\WEB-INF\classes\oscache.tld
將下列代碼加入web.xml檔案中
oscache
/WEB-INF/classes/oscache.tld
為了便於調試日誌輸出,須加入commons-logging.jar和log4j-1.2.8.jar到當前類庫路徑中
在src目錄加入下面兩個日誌輸出配置檔案:
log4j.properties 檔案內容為:
log4j.rootLogger=DEBUG,stdout,file
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[start]%d{yyyy/MM/dd/ HH:mm:ss}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD] n%c[CATEGORY]%n%m[MESSAGE]%n%n
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=oscache.log
log4j.appender.file.MaxFileSize=100KB
log4j.appender.file.MaxBackupIndex=5
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[start]%d{yyyy/MM/dd/ HH:mm:ss}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD] n%c[CATEGORY]%n%m[MESSAGE]%n%n
log4j.logger.org.apache.commons=ERROR
log4j.logger.com.opensymphony.oscache.base=INFO
commons-logging.properties 檔案內容為
org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JCategoryLog

oscache.properties 檔案配置嚮導

cache.memory
值為true 或 false ,默認為在記憶體中作快取,
如設定為false,那cache只能快取到資料庫或硬碟中,那cache還有什麼意義:)
cache.capacity
快取元素個數
cache.persistence.class
持久化快取類,如此類打開,則必須設定cache.path信息

cache.cluster 相關
為集群設定信息。

cache.cluster.multicast.ip為廣播IP位址
cache.cluster.properties為集群屬性

OSCache的基本用法

快取過濾器 CacheFilter

你可以在web.xml中定義快取過濾器,定義特定資源的快取。
注意,CacheFilter只捕獲Http頭為200的頁面請求,即只對無錯誤請求作快取,
而不對其他請求(如500,404,400)作快取處理

OSCache的特點

(1) 快取任何對象:你可以不受限制的快取部分jsp頁面或HTTP請求,任何java對象都可以快取。
(2) 擁有全面的API:OSCache API允許你通過編程的方式來控制所有的OSCache特性。
(3) 永久快取:快取能被配置寫入硬碟,因此允許在套用伺服器的多次生命周期間快取創建開銷昂貴的數據。
(4) 支持集群:集群快取數據能被單個的進行參數配置,不需要修改代碼。
(5) 快取過期:你可以有最大限度的控制快取對象的過期,包括可插入式的刷新策略(如果默認性能不能滿足需要時)。
3、OSCache的安裝與配置
網上已經有一個不錯的使用教程:http://blog.csdn.net/ezerg/archive/2004/10/14/135769.aspx
4、有關“用OSCache進行快取對象”的研究
這個是我今天要說的東西。網上對於OSCache快取Web頁面很多說明和例子,但對於快取對象方面說得不多,我就把自已寫得一些東西放出來,讓大家看一看是怎樣快取對象的!
我基於GeneralCacheAdministrator類來寫的BaseCache類
view plainprint?
package com.klstudio.cache;
import java.util.Date;
import com.opensymphony.oscache.base.NeedsRefreshException;
import com.opensymphony.oscache.general.GeneralCacheAdministrator;
public class BaseCache extends GeneralCacheAdministrator {
//過期時間(單位為秒);
private int refreshPeriod;
//關鍵字前綴字元;
private String keyPrefix;
private static final long serialVersionUID = -4397192926052141162L;
public BaseCache(String keyPrefix,int refreshPeriod){
super();
this.keyPrefix = keyPrefix;
this.refreshPeriod = refreshPeriod;
}
//添加被快取的對象;
public void put(String key,Object value){
this.putInCache(this.keyPrefix+"_"+key,value);
}
//刪除被快取的對象;
public void remove(String key){
this.flushEntry(this.keyPrefix+"_"+key);
}
//刪除所有被快取的對象;
public void removeAll(Date date){
this.flushAll(date);
}
public void removeAll(){
this.flushAll();
}
//獲取被快取的對象;
public Object get(String key) throws Exception{
try{
return this.getFromCache(this.keyPrefix+"_"+key,this.refreshPeriod);
} catch (NeedsRefreshException e) {
this.cancelUpdate(this.keyPrefix+"_"+key);
throw e;
}
}
}
package com.klstudio.cache;
import java.util.Date;
import com.opensymphony.oscache.base.NeedsRefreshException;
import com.opensymphony.oscache.general.GeneralCacheAdministrator;
public class BaseCache extends GeneralCacheAdministrator {
//過期時間(單位為秒);
private int refreshPeriod;
//關鍵字前綴字元;
private String keyPrefix;
private static final long serialVersionUID = -4397192926052141162L;
public BaseCache(String keyPrefix,int refreshPeriod){
super();
this.keyPrefix = keyPrefix; this.refreshPeriod = refreshPeriod;
}
//添加被快取的對象;
public void put(String key,Object value){
this.putInCache(this.keyPrefix+"_"+key,value);
}
//刪除被快取的對象;
public void remove(String key){
this.flushEntry(this.keyPrefix+"_"+key);
}
//刪除所有被快取的對象;
public void removeAll(Date date){
this.flushAll(date);
}
public void removeAll(){
this.flushAll();
}
//獲取被快取的對象;
public Object get(String key) throws Exception{
try{
return this.getFromCache(this.keyPrefix+"_"+key,this.refreshPeriod);
}
catch (NeedsRefreshException e) {
this.cancelUpdate(this.keyPrefix+"_"+key); throw e;
}
}
}
通過CacheManager類來看怎樣快取對象的,這個類中所用的News只是具體功能的類,我就不貼出來了,你可以自己寫一個!
view plainprint?
package com.klstudio;
import com.klstudio.News;
import com.klstudio.cache.BaseCache;
public class CacheManager {
private BaseCache newsCache;
private static CacheManager Instance;
private static Object lock = new Object();
public CacheManager() {
//這個根據配置檔案來,初始BaseCache而已;
newsCache = new BaseCache("news",1800);
}
public static CacheManager getInstance(){
if (instance == null){
synchronized( lock ){
if (instance == null){
instance = new CacheManager();
}
}
}
return instance;
}
public void putNews(News news) {
// todo 自動生成方法存根
newsCache.put(news.getID(),news);
}
public void removeNews(String newsID) {
// TODO 自動生成方法存根
newsCache.remove(newsID);
}
public News getnews(String newsID) {
// TODO 自動生成方法存根
try {
return (News) newsCache.get(newsID);
} catch (Exception e) {
// TODO 自動生成 catch 塊
System.out.println("getNews>>newsID["+newsID+"]>>"+e.getMessage());
News news = new News(newsID);
this.putNews(news);
return news;
}
}
public void removeAllNews() {
// TODO 自動生成方法存根
newsCache.removeAll();
}
}

相關詞條

相關搜尋

熱門詞條

聯絡我們