﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-风香园-文章分类-Cache</title><link>http://www.blogjava.net/wuxufeng8080/category/25893.html</link><description /><language>zh-cn</language><lastBuildDate>Sun, 16 Sep 2007 08:45:39 GMT</lastBuildDate><pubDate>Sun, 16 Sep 2007 08:45:39 GMT</pubDate><ttl>60</ttl><item><title>OSCache使用指南(ZT)</title><link>http://www.blogjava.net/wuxufeng8080/articles/145542.html</link><dc:creator>风人园</dc:creator><author>风人园</author><pubDate>Sun, 16 Sep 2007 07:44:00 GMT</pubDate><guid>http://www.blogjava.net/wuxufeng8080/articles/145542.html</guid><wfw:comment>http://www.blogjava.net/wuxufeng8080/comments/145542.html</wfw:comment><comments>http://www.blogjava.net/wuxufeng8080/articles/145542.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wuxufeng8080/comments/commentRss/145542.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wuxufeng8080/services/trackbacks/145542.html</trackback:ping><description><![CDATA[OSCache是当前运用最广的缓存方案，JBoss,Hibernate,Spring等都对其有支持，<br />
下面简单介绍一下OSCache的配置和使用过程。<br />
<br />
1.安装过程<br />
从http://www.opensymphony.com/oscache/download.html下载合适的OSCache版本，<br />
我下载的是oscache-2.0.2-full版本。<br />
解压缩下载的文件到指定目录<br />
<br />
从解压缩目录取得oscache.jar 文件放到 /WEB-INF/lib 或相应类库目录 目录中，<br />
jar文件名可能含有版本号和该版本的发布日期信息等，如oscache-2.0.2-22Jan04.jar<br />
<br />
如果你的jdk版本为1.3.x,建议在lib中加入Apache Common Lib 的commons-collections.jar包。<br />
如jdk是1.4以上则不必<br />
<br />
从src或etc目录取得oscache.properties 文件，放入src根目录或发布环境的/WEB-INF/classes 目录<br />
如你需要建立磁盘缓存，须修改oscache.properties 中的cache.path信息 (去掉前面的#注释)。<br />
win类路径类似为c:\\app\\cache<br />
unix类路径类似为/opt/myapp/cache<br />
<br />
拷贝OSCache标签库文件oscache.tld到/WEB-INF/classes目录。<br />
<br />
现在你的应用目录类似如下：<br />
$WEB_APPLICATION\WEB-INF\lib\oscache.jar<br />
$WEB_APPLICATION\WEB-INF\classes\oscache.properties<br />
$WEB_APPLICATION\WEB-INF\classes\oscache.tld<br />
<br />
<br />
将下列代码加入web.xml文件中<br />
&lt;taglib&gt;<br />
&lt;taglib-uri&gt;oscache&lt;/taglib-uri&gt;<br />
&lt;taglib-location&gt;/WEB-INF/classes/oscache.tld&lt;/taglib-location&gt;<br />
&lt;/taglib&gt; <br />
<br />
为了便于调试日志输出，须加入commons-logging.jar和log4j-1.2.8.jar到当前类库路径中<br />
<br />
在src目录加入下面两个日志输出配置文件：<br />
log4j.properties 文件内容为：<br />
log4j.rootLogger=DEBUG,stdout,file<br />
<br />
log4j.appender.stdout=org.apache.log4j.ConsoleAppender<br />
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout<br />
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<br />
<br />
<br />
<br />
log4j.appender.file=org.apache.log4j.RollingFileAppender<br />
log4j.appender.file.File=oscache.log<br />
log4j.appender.file.MaxFileSize=100KB<br />
log4j.appender.file.MaxBackupIndex=5<br />
log4j.appender.file.layout=org.apache.log4j.PatternLayout<br />
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<br />
<br />
<br />
log4j.logger.org.apache.commons=ERROR<br />
log4j.logger.com.opensymphony.oscache.base=INFO<br />
<br />
<br />
commons-logging.properties 文件内容为<br />
<br />
org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JCategoryLog<br />
<br />
2.oscache.properties 文件配置向导 <br />
<br />
cache.memory<br />
值为true 或 false ，默认为在内存中作缓存，<br />
如设置为false，那cache只能缓存到数据库或硬盘中，那cache还有什么意义：）<br />
<br />
cache.capacity<br />
缓存元素个数<br />
<br />
cache.persistence.class<br />
持久化缓存类，如此类打开，则必须设置cache.path信息<br />
<br />
cache.cluster 相关<br />
为集群设置信息。<br />
如<br />
cache.cluster.multicast.ip为广播IP地址<br />
cache.cluster.properties为集群属性<br />
<br />
<br />
3.OSCache的基本用法<br />
<br />
cache1.jsp 内容如下<br />
<br />
&lt;%@ page import="java.util.*" %&gt;<br />
&lt;%@ taglib uri="oscache" prefix="cache" %&gt;<br />
<br />
&lt;html&gt;<br />
&lt;body&gt;<br />
<br />
没有缓存的日期: &lt;%= new Date() %&gt;&lt;p&gt;<br />
&lt;!--自动刷新--&gt;<br />
&lt;cache:cache time="30"&gt;<br />
每30秒刷新缓存一次的日期: &lt;%= new Date() %&gt; <br />
&lt;/cache:cache&gt;<br />
&lt;!--手动刷新--&gt;<br />
&lt;cache:cache key="testcache"&gt;<br />
手动刷新缓存的日期: &lt;%= new Date() %&gt; &lt;p&gt;<br />
&lt;/cache:cache&gt;<br />
&lt;a href="cache2.jsp"&gt;手动刷新&lt;/a&gt;<br />
<br />
&lt;/body&gt;<br />
&lt;/html&gt;<br />
<br />
cache2.jsp 执行手动刷新页面如下<br />
&lt;%@ taglib uri="oscache" prefix="cache" %&gt;<br />
<br />
&lt;html&gt;<br />
&lt;body&gt;<br />
<br />
缓存已刷新...&lt;p&gt;<br />
<br />
&lt;cache:flush key="testcache" scope="application"/&gt;<br />
<br />
&lt;a href="cache1.jsp"&gt;返回&lt;/a&gt;<br />
<br />
&lt;/body&gt;<br />
&lt;/html&gt;<br />
<br />
<br />
你也可以通过下面语句定义Cache的有效范围,如不定义scope,scope默认为Applcation<br />
&lt;cache:cache time="30" scope="session"&gt;<br />
...<br />
&lt;/cache:cache&gt;<br />
<br />
4. 缓存过滤器 CacheFilter <br />
<br />
你可以在web.xml中定义缓存过滤器，定义特定资源的缓存。<br />
&lt;filter&gt;<br />
&lt;filter-name&gt;CacheFilter&lt;/filter-name&gt;<br />
&lt;filter-class&gt;com.opensymphony.oscache.web.filter.CacheFilter&lt;/filter-class&gt;<br />
&lt;init-param&gt;<br />
&lt;param-name&gt;time&lt;/param-name&gt;<br />
&lt;param-value&gt;60&lt;/param-value&gt;<br />
&lt;/init-param&gt;<br />
&lt;init-param&gt;<br />
&lt;param-name&gt;scope&lt;/param-name&gt;<br />
&lt;param-value&gt;session&lt;/param-value&gt;<br />
&lt;/init-param&gt;<br />
&lt;/filter&gt;<br />
&lt;filter-mapping&gt;<br />
&lt;filter-name&gt;CacheFilter&lt;/filter-name&gt;<br />
&lt;url-pattern&gt;*.jsp&lt;/url-pattern&gt;<br />
&lt;/filter-mapping&gt;<br />
上面定义将缓存所有.jsp页面，缓存刷新时间为60秒，缓存作用域为Session<br />
<br />
注意，CacheFilter只捕获Http头为200的页面请求，即只对无错误请求作缓存，<br />
而不对其他请求（如500,404,400）作缓存处理 
<img src ="http://www.blogjava.net/wuxufeng8080/aggbug/145542.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wuxufeng8080/" target="_blank">风人园</a> 2007-09-16 15:44 <a href="http://www.blogjava.net/wuxufeng8080/articles/145542.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用OSCache进行缓存对象(ZT)</title><link>http://www.blogjava.net/wuxufeng8080/articles/145541.html</link><dc:creator>风人园</dc:creator><author>风人园</author><pubDate>Sun, 16 Sep 2007 07:39:00 GMT</pubDate><guid>http://www.blogjava.net/wuxufeng8080/articles/145541.html</guid><description><![CDATA[<br />
<br />
<strong>1、OSCache是什么?</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp; OSCache标记库由OpenSymphony设计，它是一种开创性的缓存方案，它提供了在现有JSP页面之内实现内存缓存的功能。OSCache是个一个被广泛采用的高性能的J2EE缓存框架，OSCache还能应用于任何Java应用程序的普通的缓存解决方案。<br />
<strong>2、OSCache的特点</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;(1) 缓存任何对象：你可以不受限制的缓存部分jsp页面或HTTP请求，任何java对象都可以缓存。<br />
&nbsp;&nbsp;&nbsp;&nbsp;(2) 拥有全面的API：OSCache API允许你通过编程的方式来控制所有的OSCache特性。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;(3) 永久缓存：缓存能被配置写入硬盘，因此允许在应用服务器的多次生命周期间缓存创建开销昂贵的数据。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;(4) 支持集群：集群缓存数据能被单个的进行参数配置，不需要修改代码。<br />
&nbsp;&nbsp;&nbsp;&nbsp;(5) 缓存过期：你可以有最大限度的控制缓存对象的过期，包括可插入式的刷新策略（如果默认性能不能满足需要时）。<br />
<strong>3、OSCache的安装与配置</strong> <br />
&nbsp;&nbsp;&nbsp;&nbsp;网上已经有一个不错的使用教程：<a href="http://blog.csdn.net/ezerg/archive/2004/10/14/135769.aspx" target="_blank">http://blog.csdn.net/ezerg/archive/2004/10/14/135769.aspx </a><br />
<strong>4、有关&#8220;用OSCache进行缓存对象&#8221;的研究</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;这个是我今天要说的东西。网上对于OSCache缓存Web页面很多说明和例子，但对于缓存对象方面说得不多，我就把自已写得一些东西放出来，让大家看一看是怎样缓存对象的!<br />
&nbsp;&nbsp;&nbsp; 我基于GeneralCacheAdministrator类来写的BaseCache类<br />
&nbsp;&nbsp;&nbsp;
<div class="dp-highlighter">
<div class="bar">
<div class="tools"><a onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" href="http://www.klstudio.com/post/123.html#">view plain</a><a onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://www.klstudio.com/post/123.html#">copy to clipboard</a><a onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" href="http://www.klstudio.com/post/123.html#">print</a><a onclick="dp.sh.Toolbar.Command('About',this);return false;" href="http://www.klstudio.com/post/123.html#">?</a></div>
</div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">package</span><span>&nbsp;com.klstudio.cache; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span class="keyword">import</span><span>&nbsp;java.util.Date; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span class="keyword">import</span><span>&nbsp;com.opensymphony.oscache.base.NeedsRefreshException; &nbsp;&nbsp;</span></span></li>
    <li class=""><span class="keyword">import</span><span>&nbsp;com.opensymphony.oscache.general.GeneralCacheAdministrator; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;BaseCache&nbsp;</span><span class="keyword">extends</span><span>&nbsp;GeneralCacheAdministrator&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//过期时间(单位为秒); </span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;refreshPeriod; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//关键字前缀字符; </span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;String&nbsp;keyPrefix; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">final</span><span>&nbsp;</span><span class="keyword">long</span><span>&nbsp;serialVersionUID&nbsp;=&nbsp;-4397192926052141162L; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;BaseCache(String&nbsp;keyPrefix,</span><span class="keyword">int</span><span>&nbsp;refreshPeriod){ &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">super</span><span>(); &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.keyPrefix&nbsp;=&nbsp;keyPrefix; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.refreshPeriod&nbsp;=&nbsp;refreshPeriod; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//添加被缓存的对象; </span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;put(String&nbsp;key,Object&nbsp;value){ &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.putInCache(</span><span class="keyword">this</span><span>.keyPrefix+</span><span class="string">"_"</span><span>+key,value); &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//删除被缓存的对象; </span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;remove(String&nbsp;key){ &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.flushEntry(</span><span class="keyword">this</span><span>.keyPrefix+</span><span class="string">"_"</span><span>+key); &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//删除所有被缓存的对象; </span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;removeAll(Date&nbsp;date){ &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.flushAll(date); &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;removeAll(){ &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.flushAll(); &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//获取被缓存的对象; </span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;Object&nbsp;get(String&nbsp;key)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;Exception{ &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>{ &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">this</span><span>.getFromCache(</span><span class="keyword">this</span><span>.keyPrefix+</span><span class="string">"_"</span><span>+key,</span><span class="keyword">this</span><span>.refreshPeriod); &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(NeedsRefreshException&nbsp;e)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.cancelUpdate(</span><span class="keyword">this</span><span>.keyPrefix+</span><span class="string">"_"</span><span>+key); &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">throw</span><span>&nbsp;e; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
</ol>
</div>
<textarea class="java" style="display: none" name="code">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;
}
}
}
</textarea> <br />
&nbsp;&nbsp; 通过CacheManager类来看怎样缓存对象的,这个类中所用的News只是具体功能的类，我就不贴出来了，你可以自己写一个!<br />
&nbsp;&nbsp;&nbsp;
<div class="dp-highlighter">
<div class="bar">
<div class="tools"><a onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" href="http://www.klstudio.com/post/123.html#">view plain</a><a onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://www.klstudio.com/post/123.html#">copy to clipboard</a><a onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" href="http://www.klstudio.com/post/123.html#">print</a><a onclick="dp.sh.Toolbar.Command('About',this);return false;" href="http://www.klstudio.com/post/123.html#">?</a></div>
</div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">package</span><span>&nbsp;com.klstudio; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span class="keyword">import</span><span>&nbsp;com.klstudio.News; &nbsp;&nbsp;</span></span></li>
    <li class=""><span class="keyword">import</span><span>&nbsp;com.klstudio.cache.BaseCache; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;CacheManager&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;BaseCache&nbsp;newsCache; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;CacheManager&nbsp;instance; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;Object&nbsp;lock&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Object(); &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;CacheManager()&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//这个根据配置文件来，初始BaseCache而已; </span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;newsCache&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;BaseCache(</span><span class="string">"news"</span><span>,</span><span class="number">1800</span><span>);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;CacheManager&nbsp;getInstance(){ &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(instance&nbsp;==&nbsp;</span><span class="keyword">null</span><span>){ &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">synchronized</span><span>(&nbsp;lock&nbsp;){ &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(instance&nbsp;==&nbsp;</span><span class="keyword">null</span><span>){ &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;instance&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;CacheManager(); &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;instance; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;putNews(News&nbsp;news)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;TODO&nbsp;自动生成方法存根 </span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;newsCache.put(news.getID(),news); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;removeNews(String&nbsp;newsID)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;TODO&nbsp;自动生成方法存根 </span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;newsCache.remove(newsID); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;News&nbsp;getNews(String&nbsp;newsID)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;TODO&nbsp;自动生成方法存根 </span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;(News)&nbsp;newsCache.get(newsID); &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(Exception&nbsp;e)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;TODO&nbsp;自动生成&nbsp;catch&nbsp;块 </span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">"getNews&gt;&gt;newsID["</span><span>+newsID+</span><span class="string">"]&gt;&gt;"</span><span>+e.getMessage()); &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;News&nbsp;news&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;News(newsID); &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.putNews(news); &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;news; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;removeAllNews()&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;TODO&nbsp;自动生成方法存根 </span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;newsCache.removeAll(); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>}&nbsp;&nbsp;&nbsp;</span></li>
</ol>
</div>
<img src ="http://www.blogjava.net/wuxufeng8080/aggbug/145541.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wuxufeng8080/" target="_blank">风人园</a> 2007-09-16 15:39 <a href="http://www.blogjava.net/wuxufeng8080/articles/145541.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OSCache 缓存对象的总结 (ZT)</title><link>http://www.blogjava.net/wuxufeng8080/articles/145540.html</link><dc:creator>风人园</dc:creator><author>风人园</author><pubDate>Sun, 16 Sep 2007 07:36:00 GMT</pubDate><guid>http://www.blogjava.net/wuxufeng8080/articles/145540.html</guid><wfw:comment>http://www.blogjava.net/wuxufeng8080/comments/145540.html</wfw:comment><comments>http://www.blogjava.net/wuxufeng8080/articles/145540.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wuxufeng8080/comments/commentRss/145540.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wuxufeng8080/services/trackbacks/145540.html</trackback:ping><description><![CDATA[<div style="margin-top: 1px; margin-left: 15px">&nbsp;</div>
<div style="margin-top: 10px; margin-left: 15px; overflow: auto">
<table width="100%">
    <tbody>
        <tr>
            <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
            OSCache是当前运用最广的缓存方案。其主被用的最广泛功能是缓存页面，这里主要是用其缓存文件对象。<br />
            运用OScache的步骤：<br />
            &nbsp;1.取得oscache.jar 文件放到 /WEB-INF/lib 或相应类库目录 目录中。<br />
            &nbsp;2.oscache.jar依赖commons-collections.jar包。如果你的jdk版本为1.3,<br />
            &nbsp;&nbsp; 建议在lib中加入Apache Common Lib 的commons-collections.jar包。<br />
            &nbsp;&nbsp; 如jdk是1.4以上则不必要。<br />
            &nbsp;3.src根目录或发布环境的/WEB-INF/classes 目录下放入oscache.properties。<br />
            &nbsp;<br />
            &nbsp;cache.memory<br />
            &nbsp;值为true 或 false ，默认为在内存中作缓存， <br />
            &nbsp;如设置为false，那cache只能缓存到数据库或硬盘中，那cache还有什么意义：）<br />
            <br />
            &nbsp;cache.capacity <br />
            &nbsp;缓存元素个数<br />
            <br />
            &nbsp;cache.persistence.class<br />
            &nbsp;持久化缓存类，如此类打开，则必须设置cache.path信息<br />
            <br />
            &nbsp;cache.cluster 相关<br />
            &nbsp;为集群设置信息。<br />
            &nbsp;如cache.cluster.multicast.ip为广播IP地址<br />
            &nbsp;&nbsp; cache.cluster.properties为集群属性<br />
            <br />
            cache.path&nbsp;&nbsp;&nbsp; <br />
            硬盘持久化时存放文件的目录。如果目录不存在OSCache会自动创建。<br />
            Windows系统：c:\\myapp\\cache。其它：/opt/myapp/cache<br />
            <br />
            cache.persistence.overflow.only*&nbsp;&nbsp;&nbsp; <br />
            是否只有当指定的内存缓存已经满时才进行持久化。推荐使用true，flase是为向后兼容。<br />
            <br />
            cache.unlimited.disk&nbsp;&nbsp;&nbsp; <br />
            硬盘缓存是否有限制。缺省为cache.capacity指定的值<br />
            <br />
            运用：<br />
            &nbsp;&nbsp;&nbsp; com.opensymphony.oscache.general.GeneralCacheAdministrator<br />
            GeneralCacheAdministrator主要对实现持久化对象的保存以及取出的相关的操作。<br />
            <br />
            Object getFromCache（String key）&nbsp;&nbsp;&nbsp; //根据key获取缓存对象<br />
            Object getFromCache（String key , int refreshInterval）//refreshInterval时间内，根据key获取缓存对象<br />
            void putInCache(String key ,Object obj) //保存被缓存对象<br />
            void flushAll()&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; //删除所有被缓存的对象<br />
            void flushAll(Date date)&nbsp;&nbsp;&nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //在指定的时间去删除所有被缓存的对象<br />
            void cancelUpdate(String key)&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //取消未确定的更新<br />
            <div class="code_title">java 代码</div>
            <div class="dp-highlighter">
            <div class="bar">&nbsp;</div>
            <ol class="dp-j">
                <li class="alt"><span><span class="keyword">package</span><span>&nbsp;com.iflytek;&nbsp;&nbsp;</span></span>
                <li class=""><span>&nbsp;&nbsp;</span>
                <li class="alt"><span><span class="keyword">import</span><span>&nbsp;java.io.BufferedInputStream;&nbsp;&nbsp;</span></span>
                <li class=""><span><span class="keyword">import</span><span>&nbsp;java.io.BufferedOutputStream;&nbsp;&nbsp;</span></span>
                <li class="alt"><span><span class="keyword">import</span><span>&nbsp;java.io.File;&nbsp;&nbsp;</span></span>
                <li class=""><span><span class="keyword">import</span><span>&nbsp;java.io.FileInputStream;&nbsp;&nbsp;</span></span>
                <li class="alt"><span><span class="keyword">import</span><span>&nbsp;java.io.IOException;&nbsp;&nbsp;</span></span>
                <li class=""><span><span class="keyword">import</span><span>&nbsp;java.text.SimpleDateFormat;&nbsp;&nbsp;</span></span>
                <li class="alt"><span><span class="keyword">import</span><span>&nbsp;java.util.Date;&nbsp;&nbsp;</span></span>
                <li class=""><span>&nbsp;&nbsp;</span>
                <li class="alt"><span><span class="keyword">import</span><span>&nbsp;javax.servlet.ServletException;&nbsp;&nbsp;</span></span>
                <li class=""><span><span class="keyword">import</span><span>&nbsp;javax.servlet.http.HttpServlet;&nbsp;&nbsp;</span></span>
                <li class="alt"><span><span class="keyword">import</span><span>&nbsp;javax.servlet.http.HttpServletRequest;&nbsp;&nbsp;</span></span>
                <li class=""><span><span class="keyword">import</span><span>&nbsp;javax.servlet.http.HttpServletResponse;&nbsp;&nbsp;</span></span>
                <li class="alt"><span><span class="keyword">import</span><span>&nbsp;javax.servlet.http.HttpSession;&nbsp;&nbsp;</span></span>
                <li class=""><span>&nbsp;&nbsp;</span>
                <li class="alt"><span><span class="keyword">import</span><span>&nbsp;com.opensymphony.oscache.base.NeedsRefreshException;&nbsp;&nbsp;</span></span>
                <li class=""><span><span class="keyword">import</span><span>&nbsp;com.opensymphony.oscache.general.GeneralCacheAdministrator;&nbsp;&nbsp;</span></span>
                <li class="alt"><span>&nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;</span>
                <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;DisplayChart&nbsp;</span><span class="keyword">extends</span><span>&nbsp;HttpServlet&nbsp;{&nbsp;&nbsp;</span></span>
                <li class=""><span>&nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">/**</span>&nbsp;</span>
                <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Default&nbsp;constructor.</span>&nbsp;</span>
                <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;DisplayChart()&nbsp;{&nbsp;&nbsp;</span></span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">super</span><span>();&nbsp;&nbsp;</span></span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">/**</span>&nbsp;</span>
                <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Init&nbsp;method.</span>&nbsp;</span>
                <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span>&nbsp;</span>
                <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@throws&nbsp;ServletException&nbsp;never.</span>&nbsp;</span>
                <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;init()&nbsp;</span><span class="keyword">throws</span><span>&nbsp;ServletException&nbsp;{&nbsp;&nbsp;</span></span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>;&nbsp;&nbsp;</span></span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;GeneralCacheAdministrator&nbsp;cacheAdmin&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;GeneralCacheAdministrator();&nbsp;&nbsp;</span></span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;service(HttpServletRequest&nbsp;request,&nbsp;&nbsp;&nbsp;</span></span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpServletResponse&nbsp;response)&nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">throws</span><span>&nbsp;ServletException,&nbsp;IOException&nbsp;{&nbsp;&nbsp;</span></span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;path&nbsp;=&nbsp;getServletContext().getRealPath(<span class="string">"/"</span><span>);&nbsp;&nbsp;&nbsp;</span></span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File&nbsp;file&nbsp;=&nbsp;<span class="keyword">null</span><span>;&nbsp;&nbsp;</span></span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SimpleDateFormat&nbsp;sdf=&nbsp;<span class="keyword">new</span><span>&nbsp;SimpleDateFormat(</span><span class="string">"hh-mm-ss"</span><span>);&nbsp;&nbsp;</span></span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">try</span><span>&nbsp;{&nbsp;&nbsp;</span></span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file&nbsp;=&nbsp;(File)cacheAdmin.getFromCache(sdf.format(<span class="keyword">new</span><span>&nbsp;Date()));&nbsp;&nbsp;</span></span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(<span class="string">"来自缓存!"</span><span>+&nbsp;sdf.format(</span><span class="keyword">new</span><span>&nbsp;Date()));&nbsp;&nbsp;</span></span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span class="keyword">catch</span><span>&nbsp;(NeedsRefreshException&nbsp;e)&nbsp;{&nbsp;&nbsp;</span></span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;File(path+</span><span class="string">"xmls\\Pipe11.xml"</span><span>);&nbsp;&nbsp;</span></span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cacheAdmin.putInCache(sdf.format(<span class="keyword">new</span><span>&nbsp;Date()),&nbsp;file);&nbsp;&nbsp;</span></span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(<span class="string">"--缓存没有!"</span><span>+sdf.format(</span><span class="keyword">new</span><span>&nbsp;Date()));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sendResponse(file,response);&nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>;&nbsp;&nbsp;</span></span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">/**</span>&nbsp;</span>
                <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;把文件用响应流写出</span>&nbsp;</span>
                <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;file</span>&nbsp;</span>
                <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;response</span>&nbsp;</span>
                <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@throws&nbsp;IOException</span>&nbsp;</span>
                <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;sendResponse(File&nbsp;file,HttpServletResponse&nbsp;response)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;IOException{&nbsp;&nbsp;</span></span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BufferedInputStream&nbsp;&nbsp;bis&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;BufferedInputStream(</span><span class="keyword">new</span><span>&nbsp;FileInputStream(file));&nbsp;&nbsp;</span></span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BufferedOutputStream&nbsp;bos&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;BufferedOutputStream(response.getOutputStream());&nbsp;&nbsp;</span></span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">byte</span><span>[]&nbsp;input&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;</span><span class="keyword">byte</span><span>[</span><span class="number">1024</span><span>];&nbsp;&nbsp;</span></span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">boolean</span><span>&nbsp;eof&nbsp;=&nbsp;</span><span class="keyword">false</span><span>;&nbsp;&nbsp;</span></span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">while</span><span>&nbsp;(!eof)&nbsp;{&nbsp;&nbsp;</span></span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">int</span><span>&nbsp;length&nbsp;=&nbsp;bis.read(input);&nbsp;&nbsp;</span></span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(length&nbsp;==&nbsp;-</span><span class="number">1</span><span>)&nbsp;{&nbsp;&nbsp;</span></span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eof&nbsp;=&nbsp;<span class="keyword">true</span><span>;&nbsp;&nbsp;</span></span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">else</span><span>&nbsp;{&nbsp;&nbsp;</span></span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bos.write(input,&nbsp;<span class="number">0</span><span>,&nbsp;length);&nbsp;&nbsp;</span></span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bos.flush();&nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bis.close();&nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bos.close();&nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;</span>
                <li class=""><span>}&nbsp;&nbsp;</span> </li>
            </ol>
            </div>
            </td>
        </tr>
    </tbody>
</table>
</div>
<img src ="http://www.blogjava.net/wuxufeng8080/aggbug/145540.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wuxufeng8080/" target="_blank">风人园</a> 2007-09-16 15:36 <a href="http://www.blogjava.net/wuxufeng8080/articles/145540.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>