複製鏈接
請複製以下鏈接發送給好友

oscache

鎖定
OSCache由OpenSymphony設計,它是一種開創性的JSP定製標記應用,提供了在現有JSP頁面之內實現快速內存緩衝的功能。
外文名
oscache
作    者
OpenSymphony
性    質
JSP定製標記應用
功    能
快速內存緩衝

oscache設計介紹

OSCache是個一個廣泛採用的高性能的J2EE緩存框架,OSCache能用於任何Java應用程序的普通的緩存解決方案。

oscache特點介紹

緩存任何對象,你可以不受限制的緩存部分jsp頁面或HTTP請求,任何java對象都可以緩存。
擁有全面的API--OSCache API給你全面的程序來控制所有的OSCache特性。
永久緩存--緩存能隨意的寫入硬盤,因此允許昂貴的創建(expensive-to-create)數據來保持緩存,甚至能讓應用重啓。
支持集羣--集羣緩存數據能被單個的進行參數配置,不需要修改代碼。
緩存記錄的過期--你可以有最大限度的控制緩存對象的過期,包括可插入式的刷新策略(如果默認性能不需要時)

oscache安裝過程

下載合適的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.Hmm: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.H: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文件配置

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緩存過濾

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

oscache相關研究

“用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;

}

}

}
通過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();

}

}