﻿<?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-刘文涛-随笔分类-OSCache 2.3</title><link>http://www.blogjava.net/liuwentao253/category/14250.html</link><description>I am a coder</description><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 08:41:40 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 08:41:40 GMT</pubDate><ttl>60</ttl><item><title>在Hibernate中使用分布式 OSCache </title><link>http://www.blogjava.net/liuwentao253/archive/2006/08/19/64499.html</link><dc:creator>刘文涛</dc:creator><author>刘文涛</author><pubDate>Sat, 19 Aug 2006 02:53:00 GMT</pubDate><guid>http://www.blogjava.net/liuwentao253/archive/2006/08/19/64499.html</guid><description><![CDATA[
		<p>OSCache是一个工业级的J2EE缓存实现。<br /><br />它可以缓存 ：</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #008080">1</span>
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">java对象，<br /></span>
				<span style="COLOR: #008080">2</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />页面<br /></span>
				<span style="COLOR: #008080">3</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />http请求<br /></span>
				<span style="COLOR: #008080">4</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />二进制内容：例如PDF文件</span>
		</div>
		<p>等<br /><br /><br />正文开始 。。。</p>
		<p> 为了减少与数据库通信 来提高应用的性能,我们在Hibernate中使用了<strong><font color="#0000ff"><u>分布式缓存</u></font></strong>：OSCache。</p>
		<p>       Oscache是得到了广泛使用的<font color="#0000ff"><strong>开源 Cache 实现</strong></font>（Hibernate中对它提供了支持），它基于更加可靠高效的设计，最重要的是，<font color="#0000ff"><strong>新版本的OSCache已经支持集群分布式</strong></font>。如果系统需要在部署在集群中，或者需要部署在<font color="#0000ff"><strong>多机负载均衡模式</strong></font>的环境中来获取更高性能，那么 OSCache将是不二之选。<br /></p>
		<p>      我们知道为了实现<font color="#0000ff"><strong><u>分布式环境下消息</u></strong></font>的通知,目前两种比较流行的做法是使用 ：</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #008080">1</span>
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">JavaGroups[http:</span>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000">www.jgroups.org]</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #008080">2</span>
				<span style="COLOR: #008000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<strong>
						<span style="COLOR: #000000">JMS</span>
				</strong>
		</div>
		<p>这两种方式都在底层实现了广播发布消息。 由于<font color="#0000ff"><strong>JGroups</strong></font>可以提供可靠的广播通信.所以我们准备采用JGroups。<br /><br />一、环境说明<strong></strong></p>
		<div>
				<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
						<span style="COLOR: #008080">1</span>
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						<span style="COLOR: #000000">OSCache: oscache</span>
						<span style="COLOR: #000000">-</span>
						<span style="COLOR: #000000">2.3</span>
						<span style="COLOR: #000000">.jar<br /></span>
						<span style="COLOR: #008080">2</span>
						<span style="COLOR: #000000">
								<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />JGroups: </span>
						<span style="COLOR: #000000">2.2</span>
						<span style="COLOR: #000000">.</span>
						<span style="COLOR: #000000">8</span>
						<span style="COLOR: #000000">,目前最高版本是 </span>
						<span style="COLOR: #000000">2.2</span>
						<span style="COLOR: #000000">.</span>
						<span style="COLOR: #000000">9.1</span>
						<span style="COLOR: #000000">
								<br />
						</span>
						<span style="COLOR: #008080">3</span>
						<span style="COLOR: #000000">
								<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />Hibernate: </span>
						<span style="COLOR: #000000">3.05</span>
				</div>
				<br />二、下面给出 OScache 官方文档对 JavaGroups 使用的说明：     </div>
		<div>
				<p>
						<span style="COLOR: #0000ff">JavaGroups Configuration<br />Just make sure you have jgroups-all.jar file in your classpath (for a webapp put it in WEB-INF/lib), and add the JavaGroups broadcasting listener to your oscache.properties file like this:</span>
						<strong>
								<br />
								<br />cache.event.listeners=com.opensymphony.oscache.plugins.clustersupport.JavaGroupsBroadcastingListener</strong>
				</p>
				<p>In most cases, that's it! OSCache will now broadcast any cache flush events across the LAN. The jgroups-all.jar library is not included with the binary distribution due to its size, however you can obtain it either by downloading the full OSCache distribution, or by visiting the JavaGroups website.</p>
				<p>If you want to run more than one OSCache cluster on the same LAN, you will need to use different multicast IP addresses. This allows the caches to exist in separate multicast groups and therefore not interfere with each other. The IP to use can be specified in your oscache.properties file by the cache.cluster.multicast.ip property. The default value is 231.12.21.132, however you can use any class D IP address. Class D address fall in the range 224.0.0.0 through 239.255.255.255.</p>
				<p>If you need more control over the multicast configuration (eg setting network timeout or time-to-live values), you can use the cache.cluster.properties configuration property. <strong>Use this instead of the cache.cluster.multicast.ip property</strong>. The default value is:</p>
				<p>
						<strong>UDP(mcast_addr=231.12.21.132;mcast_port=45566;ip_ttl=32;\<br />mcast_send_buf_size=150000;mcast_recv_buf_size=80000):\<br />PING(timeout=2000;num_initial_members=3):\<br />MERGE2(min_interval=5000;max_interval=10000):\<br />FD_SOCK:VERIFY_SUSPECT(timeout=1500):\<br />pbcast.NAKACK(gc_lag=50;retransmit_timeout=300,600,1200,2400,4800;max_xmit_size=8192):\<br />UNICAST(timeout=300,600,1200,2400):\<br />pbcast.STABLE(desired_avg_gossip=20000):\<br />FRAG(frag_size=8096;down_thread=false;up_thread=false):\<br />pbcast.GMS(join_timeout=5000;join_retry_timeout=2000;shun=false;print_local_addr=true)</strong>
				</p>
				<p>See the JavaGroups site for more information. In particular, look at the documentation of Channels in the User's Guide. </p>
		</div>
		<p>三、我在应用中使用的 OSCache.properties<font color="#000000">：</font></p>
		<div>
				<p>
						<span style="COLOR: #0000ff"># CACHE IN MEMORY<br />#<br /># If you want to disable memory caching, just uncomment this line.<br />#<br /><font color="#ff0000"># 不使用内存 </font></span>
						<span style="COLOR: #0000ff">
								<br />cache.memory=false</span>
				</p>
				<p>
						<br /># CACHE KEY<br />#<br /># This is the key that will be used to store the cache in the application<br /># and session scope.<br />#<br /># If you want to set the cache key to anything other than the default<br /># uncomment this line and change the cache.key<br />#<br /># cache.key=__oscache_cache</p>
				<p>
						<br /># USE HOST DOMAIN NAME IN KEY<br />#<br /># Servers for multiple host domains may wish to add host name info to<br /># the generation of the key. If this is true, then uncomment the<br /># following line.<br />#<br /># cache.use.host.domain.in.key=true</p>
				<p>
						<br /># CACHE LISTENERS<br />#<br /># These hook OSCache events and perform various actions such as logging<br /># cache hits and misses, or broadcasting to other cache instances across a cluster.<br /># See the documentation for further information.<br />#<br /># cache.event.listeners=com.opensymphony.oscache.plugins.clustersupport.JMSBroadcastingListener, \<br /># com.opensymphony.oscache.extra.CacheEntryEventListenerImpl, \<br /># com.opensymphony.oscache.extra.CacheMapAccessEventListenerImpl, \<br /># com.opensymphony.oscache.extra.ScopeEventListenerImpl<br /><font color="#ff0000"><br /># 使用 JavaGroups 来实现监听广播式缓存</font><br />cache.event.listeners=com.opensymphony.oscache.plugins.clustersupport.JavaGroupsBroadcastingListener</p>
				<p>
				</p>
				<p># CACHE PERSISTENCE CLASS<br />#<br /># Specify the class to use for persistence. If you use the supplied DiskPersistenceListener,<br /># don't forget to supply the cache.path property to specify the location of the cache<br /># directory.<br /># <br /># If a persistence class is not specified, OSCache will use memory caching only.<br />#<br /><font color="#ff0000"># 启动硬盘持久化 Cache</font><br />cache.persistence.class=com.opensymphony.oscache.plugins.diskpersistence.DiskPersistenceListener</p>
				<p># CACHE OVERFLOW PERSISTENCE<br /># Use persistent cache in overflow or not. The default value is false, which means<br /># the persistent cache will be used at all times for every entry. true is the recommended setting.<br />#<br /># cache.persistence.overflow.only=true</p>
				<p># CACHE DIRECTORY<br />#<br /># This is the directory on disk where caches will be stored by the DiskPersistenceListener.<br /># it will be created if it doesn't already exist. Remember that OSCache must have<br /># write permission to this directory.<br />#<br /># Note: for Windows machines, this needs \ to be escaped<br /># ie Windows:<br /># cache.path=c:\\myapp\\cache<br /># or *ix:</p>
				<p>
						<font color="#ff0000"># 在Linux下的Cache存放路径</font>
						<br />cache.path=/data/jsp/boss.21cn.com/bossimpls/cache/bossuud<br />#<br /># cache.path=c:\\app\\cache</p>
				<p>
						<br /># CACHE ALGORITHM<br />#<br /># Default cache algorithm to use. Note that in order to use an algorithm<br /># the cache size must also be specified. If the cache size is not specified,<br /># the cache algorithm will be Unlimited cache.<br />#</p>
				<p>
						<font color="#ff0000">#使用LRU运算算法，把最少使用的Cache剔除出去</font>
						<br />cache.algorithm=com.opensymphony.oscache.base.algorithm.LRUCache<br /># cache.algorithm=com.opensymphony.oscache.base.algorithm.FIFOCache<br /># cache.algorithm=com.opensymphony.oscache.base.algorithm.UnlimitedCache</p>
				<p># THREAD BLOCKING BEHAVIOR<br />#<br /># When a request is made for a stale cache entry, it is possible that another thread is already<br /># in the process of rebuilding that entry. This setting specifies how OSCache handles the<br /># subsequent 'non-building' threads. The default behaviour (cache.blocking=false) is to serve<br /># the old content to subsequent threads until the cache entry has been updated. This provides<br /># the best performance (at the cost of serving slightly stale data). When blocking is enabled,<br /># threads will instead block until the new cache entry is ready to be served. Once the new entry<br /># is put in the cache the blocked threads will be restarted and given the new entry.<br /># Note that even if blocking is disabled, when there is no stale data available to be served<br /># threads will block until the data is added to the cache by the thread that is responsible<br /># for building the data.<br />#<br /># cache.blocking=false</p>
				<p># CACHE SIZE<br />#<br /># Default cache size in number of items. If a size is specified but not<br /># an algorithm, the cache algorithm used will be LRUCache.<br />#</p>
				<p>
						<font color="#ff0000">#这个值设得够大了，就是Cache的容量项目个数</font>
						<br />cache.capacity=100000000</p>
				<p>
						<br /># CACHE UNLIMITED DISK<br /># Use unlimited disk cache or not. The default value is false, which means<br /># the disk cache will be limited in size to the value specified by cache.capacity.<br />#</p>
				<p>
						<font color="#ff0000">#不使用无限硬盘空间</font>
						<br />cache.unlimited.disk=false</p>
				<p>
						<br /># JMS CLUSTER PROPERTIES<br />#<br /># Configuration properties for JMS clustering. See the clustering documentation<br /># for more information on these settings.<br />#<br />#cache.cluster.jms.topic.factory=java:comp/env/jms/TopicConnectionFactory<br />#cache.cluster.jms.topic.name=java:comp/env/jms/OSCacheTopic<br />#cache.cluster.jms.node.name=node1</p>
				<p>
						<br /># JAVAGROUPS CLUSTER PROPERTIES<br />#<br /># Configuration properites for the JavaGroups clustering. Only one of these<br /># should be specified. Default values (as shown below) will be used if niether<br /># property is set. See the clustering documentation and the JavaGroups project<br /># (www.javagroups.com) for more information on these settings.<br />#<br />cache.cluster.properties=UDP(mcast_addr=231.12.21.132;mcast_port=45566;ip_ttl=32;\<br />mcast_send_buf_size=150000;mcast_recv_buf_size=80000):\<br />PING(timeout=2000;num_initial_members=3):\<br />MERGE2(min_interval=5000;max_interval=10000):\<br />FD_SOCK:VERIFY_SUSPECT(timeout=1500):\<br />pbcast.NAKACK(gc_lag=50;retransmit_timeout=300,600,1200,2400,4800;max_xmit_size=8192):\<br />UNICAST(timeout=300,600,1200,2400):\<br />pbcast.STABLE(desired_avg_gossip=20000):\<br />FRAG(frag_size=8096;down_thread=false;up_thread=false):\<br />pbcast.GMS(join_timeout=5000;join_retry_timeout=2000;shun=false;print_local_addr=true)<br />cache.cluster.multicast.ip=231.12.21.132<br /></p>
		</div>
		<p>
				<strong>关于作者</strong>
		</p>
		<div>
				<p>网名：润名<br />E-mail: winsonhrh@gmail.com<br />现从事于 21cn 公司，从事 J2EE 架构设计，有四年 J2EE工作经验。善长于对 Open Source Framework的技术整合开发和各种应用服务器的调优。</p>
		</div>
<img src ="http://www.blogjava.net/liuwentao253/aggbug/64499.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuwentao253/" target="_blank">刘文涛</a> 2006-08-19 10:53 <a href="http://www.blogjava.net/liuwentao253/archive/2006/08/19/64499.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>应用OSCache提升J2EE系统运行性能 </title><link>http://www.blogjava.net/liuwentao253/archive/2006/08/19/64491.html</link><dc:creator>刘文涛</dc:creator><author>刘文涛</author><pubDate>Sat, 19 Aug 2006 02:03:00 GMT</pubDate><guid>http://www.blogjava.net/liuwentao253/archive/2006/08/19/64491.html</guid><description><![CDATA[
		<p>文章摘要<br />Cache是一种用于提高系统响应速度、改善系统运行性能的技术。尤其是在Web应用中，通过缓存页面的输出结果，可以很显著的改善系统运行性能。本文中作者给大家介绍一个实现J2EE框架中<font color="#0000ff"><strong>Web应用层</strong></font>缓存功能的开放源代码项目----OSCache。通过应用OSCache，我们不但可以实现通常的Cache功能，还能够改善系统的稳定性。它的最新版本是 ：OSCache2.3</p>
		<p>1 面临的问题<br />1.1 需要处理的特殊动态内容<br />在信息系统建设过程中我们通常会遇到这样的问题：<br /><br />1. 基础数据的变更问题<br />信息系统中需要处理的基础数据的内容短时间内是不会发生变化的，但是在一个相对长一些的时间里，它却可能是动态增加或者减少的。</p>
		<p>举个例子：电子商务中关于送货区域的定义，可能短时间内不会发生变化，但是随着电子商务企业业务的扩大，系统中需要处理的送货区域就可能增加。所以我们的系统中不得不在每次向客户展示送货区域信息的时候都和数据库（假设送货区域信息保存在数据库中，这也是通常采用的处理方法）进行交互。</p>
		<p>2. 统计报表（不仅限于统计报表）的问题<br />一般来说，统计报表是一个周期性的工作，可能是半个月、一个月或者更长的时间才会需要更新一次，然而统计报表通常是图形显示或者是生成pdf、word、excel等格式的文件，这些图形内容、文件的生成通常需要消耗很多的系统资源，给系统运行造成很大的负担。</p>
		<p>1.2 问题的共同点<br />通过比较分析，不难发现这两类问题有一些共同点：</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">1</span>
				<span style="COLOR: #000000">、被处理的内容短时间不变，所以短时间内可以作为静态内容进行处理<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #000000">2</span>
				<span style="COLOR: #000000">、在一个不太长的时间内，被处理的内容可能或者必定产生变化，所以必须将他们作为动态内容进行处理<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #000000">3</span>
				<span style="COLOR: #000000">、在合理的时间区段内可以忽略被处理内容变化后带来的影响<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #000000">4</span>
				<span style="COLOR: #000000">、对这些内容的处理动作比较消耗系统性能，影响系统响应时间</span>
		</div>
		<p>1.3 解决方法<br />缓存技术可以帮助我们很好的解决这个问题：</p>
		<p>1、缓存信息<br />当上述的基础数据或者统计报表第一次被访问时，被处理的内容被当作动态信息，基础数库从数据库中获得，统计报表也会被生成符合要求的图形、文件，然后这些信息都会被放入缓存信息中。</p>
		<p>2、响应信息由缓存提供<br />当上述的基础数据或者统计报表继续被访问时，系统将会首先检查缓存信息中是否有对应的内容和我们设定的缓存规则，如果符合缓存信息存在而且符合缓存规则，给出的响应将来自于缓存信息，如果没有或者缓存信息已经不符合设定的要求，系统将重复上一步的动作。</p>
		<p>很显然，上面的步骤2中，多数情况下，当用户请求到达时，被处理的内容将来自于缓存，所以大大的减少了与数据库的交互，或者不再需要为每个请求都生成一次报表图形或者文件，这部分工作的减少对于</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #008080">1</span>
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">降低系统性能消耗<br /></span>
				<span style="COLOR: #008080">2</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />提高系统稳定性<br /></span>
				<span style="COLOR: #008080">3</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />提高并发处理能力</span>
		</div>
		<p>是非常有益的。</p>
		<p>2 OSCache简介 <br />OSCache是OpenSymphony组织提供的一个J2EE架构中Web应用层的缓存技术实现组件，它的出现解决了我们面临的问题。 OSCache目前最新的稳定版本是2.3。</p>
		<p>2.1 主要特征<br /><br />1. 兼容多种支持JSP的web服务器<br /><br />已经通过兼容测试的web服务器包括 ：</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #008080">1</span>
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">OrionServer (</span>
				<span style="COLOR: #000000">1.4</span>
				<span style="COLOR: #000000">.0或者以上版本)<br /></span>
				<span style="COLOR: #008080">2</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />Macromedia JRun (</span>
				<span style="COLOR: #000000">3</span>
				<span style="COLOR: #000000">.0或者以上版本)<br /></span>
				<span style="COLOR: #008080">3</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />BEA Weblogic (</span>
				<span style="COLOR: #000000">7</span>
				<span style="COLOR: #000000">.x或者以上版本)<br /></span>
				<span style="COLOR: #008080">4</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />IBM Websphere (</span>
				<span style="COLOR: #000000">5</span>
				<span style="COLOR: #000000">.0版本)<br /></span>
				<span style="COLOR: #008080">5</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />Silverstream (</span>
				<span style="COLOR: #000000">3.7</span>
				<span style="COLOR: #000000">.4版本)<br /></span>
				<span style="COLOR: #008080">6</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />Caucho Resin (</span>
				<span style="COLOR: #000000">1.2</span>
				<span style="COLOR: #000000">.3或者以上版本)<br /></span>
				<span style="COLOR: #008080">7</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />Tomcat (</span>
				<span style="COLOR: #000000">4</span>
				<span style="COLOR: #000000">.0或者以上版本)<br /></span>
				<span style="COLOR: #008080">8</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />其他支持servlet2.</span>
				<span style="COLOR: #000000">3</span>
				<span style="COLOR: #000000">、jsp1.2的web服务器</span>
		</div>
		<p>2. 可选的缓存区</p>
		<p>你可以使用内存、硬盘空间、同时使用内存和硬盘或者提供自己的其他资源（<font color="#0000ff"><strong>需要自己提供适配器</strong></font>）作为缓存区。</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #008080">1</span>
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">使用内存作为缓存区将可以提供更好的性能 <br /></span>
				<span style="COLOR: #008080">2</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />使用硬盘作为缓存区可以在服务器重起后迅速恢复缓存内容 <br /></span>
				<span style="COLOR: #008080">3</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />同时使用内存和硬盘作为缓存区则可以减少对内存的占用 </span>
		</div>
		<p>3. 灵活的缓存系统</p>
		<p>OSCache支持对部分<font color="#0000ff"><strong><u>页面内容</u></strong></font>或者对<font color="#0000ff"><strong><u>页面级的响应内容</u></strong></font>进行缓存，编程者可以根据不同的需求、不同的环境选择不同的缓存级别。</p>
		<p>4. 容错</p>
		<p>在一般的web应用中，如果某个页面需要和数据库打交道，而当客户请求到达时，web应用和数据库之间无法进行交互，那么将返回给用户"系统出错"或者类似的提示信息，如果使用了OSCache的话，你可以使用缓存提供给用户，给自己赢得维护系统或者采取其他补救的时间。</p>
		<p>5.其它特性<br /><br />包括对集群的支持、缓存主动刷新等特性，大家可以参考OpenSymphony网站上的其他资源获取更多的信息。<br /></p>
		<p>3 OSCache组件的安装<br /><br />OSCache是一个基于web应用的组件，他的安装工作主要是对web应用进行配置，大概的步骤如下：</p>
		<p>1. 下载、解压缩OSCache</p>
		<p>请到OSCache的主页<a href="http://www.opensymphony.com/oscache/download.html">http://www.opensymphony.com/oscache/download.html</a>下载Oscache的最新版本，作者下载的是OSCache的最新稳定版本2.3。<br /><br />4 开始使用OSCache中的缓存组件<br />OSCache中按照缓存范围的不同分为两种不同的方式：一种是缓存JSP页面中部分或者全部内容，一种是基于整个页面文件的缓存。</p>
		<p>4.1 JSP部分内容缓存<br />4.1.1 Cache-OSCache提供的缓存标签<br />这是OSCache提供的标签库中最重要的一个标签，包括在标签中的内容将应用缓存机制进行处理，处理的方式将取决于编程者对cache标签属性的设置。</p>
		<p>第一次请求到达时，标签中的内容被处理并且缓存起来，当下一个请求到达时，缓存系统会检查这部分内容的缓存是否已经失效，主要是以下几项：</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #008080">1</span>
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">1</span>
				<span style="COLOR: #000000">. 缓存时间超过了cache标签设置的time或者duration属性规定的超时时间 <br /></span>
				<span style="COLOR: #008080">2</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000">2</span>
				<span style="COLOR: #000000">. cron属性规定的时间比缓存信息的开始时间更晚 <br /></span>
				<span style="COLOR: #008080">3</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000">3</span>
				<span style="COLOR: #000000">. 标签中缓存的内容在缓存后又被重新刷新过 <br /></span>
				<span style="COLOR: #008080">4</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000">4</span>
				<span style="COLOR: #000000">. 其他缓存超期设定</span>
		</div>
		<p>如果符合上面四项中的任何一项，被缓存的内容视为已经失效，这时被缓存的内容将被重新处理并且返回处理过后的信息，如果被缓存的内容没有失效，那么返回给用户的将是缓存中的信息。</p>
		<p>cache标签的属性说明:</p>
		<p>key - 标识缓存内容的关键词。在指定的作用范围内必须是唯一的。默认的key是被访问页面的URI和后面的请求字符串。</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">你可以在同一个页面中使用很多cache标签而不指定他的key属性，这种情况下系统使用该页面的URI和后面的请求字符串，另外再自动给这些key增加一个索引值来区分这些缓存内容。但是不推荐采用这样的方式。</span>
		</div>
		<p>scope - 缓存发生作用的范围，可以是application或者session</p>
		<p>time - 缓存内容的时间段，单位是秒，默认是3600秒，也就是一个小时，如果设定一个负值，那么这部分被缓存的内容将永远不过期。 </p>
		<p>duration - 指定缓存内容失效的时间，是相对time的另一个选择，可以使用简单日期格式或者符合USO-8601的日期格式。如：duration='PT5M' duration='5s'等</p>
		<p>refresh - false 或者true。<br /><font color="#0000ff"><strong>如果refresh属性设置为true，不管其他的属性是否符合条件，这部分被缓存的内容都将被更新，这给编程者一种选择，决定什么时候必须刷新</strong></font>。 </p>
		<p>mode - 如果编程者不希望被缓存的内容增加到给用户的响应中，可以设置mode属性为"silent"</p>
		<p>其它可用的属性还包括：</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #008080">1</span>
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">silent<br /></span>
				<span style="COLOR: #008080">2</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />cron<br /></span>
				<span style="COLOR: #008080">3</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />groups<br /></span>
				<span style="COLOR: #008080">4</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />language<br /></span>
				<span style="COLOR: #008080">5</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />refreshpolicyclass<br /></span>
				<span style="COLOR: #008080">6</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />refreshpolicyparam</span>
		</div>
		<p>上面的这些属性可以单独使用，也可以根据需要组合使用，下面的例子将讲解这些常用属性的使用方式。</p>
		<p>4.1.2 Cache标签实例分析:<br /><br />1. 最简单的cache标签用法</p>
		<p>使用默认的关键字来标识cache内容，超时时间是默认的3600秒</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #008080">1</span>
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">cache:cache</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">2</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #000000">&lt;%</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">3</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000">自己的JSP代码内容</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #008080">4</span>
				<span style="COLOR: #008000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000">    </span>
				<span style="COLOR: #000000">%&gt;</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">5</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">cache:cache</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000"> </span>
		</div>
		<p>
				<br />2. 用自己指定的字符串标识缓存内容，并且设定作用范围为session。</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #008080">1</span>
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">cache:cache key</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">foobar</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000"> scope</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">session</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">2</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #000000">&lt;%</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">3</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000">自己的JSP代码内容</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #008080">4</span>
				<span style="COLOR: #008000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000">    </span>
				<span style="COLOR: #000000">%&gt;</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">5</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">cache:cache</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000"> </span>
		</div>
		<p>
				<br />3.动态设定key值，使用自己指定的time属性设定缓存内容的超时时间，使用动态refresh值决定是否强制内容刷新。</p>
		<p>因为OSCache使用key值来标识缓存内容，使用相同的key值将会被认为使用相同的的缓存内容，所以使用动态的key值可以自由的根据不同的角色、不同的要求决定使用不同的缓存内容。</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #008080">1</span>
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">cache:cache key</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">&lt;%= product.getId() %&gt;</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000"> time</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">1800</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000"> refresh</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">&lt;%= needRefresh %&gt;</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">2</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #000000">&lt;%</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">3</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000">自己的JSP代码内容</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #008080">4</span>
				<span style="COLOR: #008000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000">    </span>
				<span style="COLOR: #000000">%&gt;</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">5</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">cache:cache</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000"> </span>
		</div>
		<p>
				<br />4. 设置time属性为负数使缓存内容永不过期</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #008080">1</span>
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">cache:cache time</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">-1</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">2</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #000000">&lt;%</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">3</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000">自己的JSP代码内容</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #008080">4</span>
				<span style="COLOR: #008000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000">    </span>
				<span style="COLOR: #000000">%&gt;</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">5</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">cache:cache</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000"> </span>
		</div>
		<p>
				<br />5. 使用duration属性设置超期时间</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #008080">1</span>
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">cache:cache  duration</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">'</span>
				<span style="COLOR: #000000">PT5M</span>
				<span style="COLOR: #000000">'</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">2</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #000000">&lt;%</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">3</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000">自己的JSP代码内容</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #008080">4</span>
				<span style="COLOR: #008000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000">    </span>
				<span style="COLOR: #000000">%&gt;</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">5</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">cache:cache</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000"> </span>
		</div>
		<p>
				<br />6. 使用mode属性使被缓存的内容不加入给客户的响应中</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #008080">1</span>
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">cache:cache  mode</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">'</span>
				<span style="COLOR: #000000">silent</span>
				<span style="COLOR: #000000">'</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">2</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #000000">&lt;%</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">3</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000">自己的JSP代码内容</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #008080">4</span>
				<span style="COLOR: #008000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000">    </span>
				<span style="COLOR: #000000">%&gt;</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">5</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">cache:cache</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000"> </span>
		</div>
		<p>
				<br />4.2 用CashFilter实现页面级缓存<br /><br />在OSCache组件中提供了一个CacheFilter用于实现<font color="#0000ff"><strong>页面级的缓存</strong></font>，主要用于对web应用中的某些动态页面进行缓存，尤其是那些需要生成pdf格式文件/报表、图片文件等的页面，不仅减少了数据库的交互、减少数据库服务器的压力，而且对于减少web服务器的性能消耗有很显著的效果。</p>
		<p>这种功能的实现是通过在web.xml中进行配置来决定缓存哪一个或者一组页面，而且还可以设置缓存的相关属性，这种基于配置文件的实现方式对于J2EE来说应该是一种标准的实现方式了。</p>
		<p>[注] 只有客户访问时返回http头信息中代码为200（也就是访问已经成功）的页面信息才能够被缓存<br /></p>
		<p>
				<br />修改web.xml，增加如下内容，<br /><br /></p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #008080">1</span>
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">filter</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">2</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">filter</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000">name</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">CacheFilter</span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">filter</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000">name</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">3</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">filter</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">com.opensymphony.oscache.web.filter.CacheFilter</span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">filter</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">4</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">filter</span>
				<span style="COLOR: #000000">&gt;</span>
		</div>
		<p>
				<br />
				<br />1. 缓存单个文件</p>
		<p>确定对/testContent.jsp页面进行缓存。<br /><br /></p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #008080">1</span>
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">filter</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000">mapping</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">2</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">filter</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000">name</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">CacheFilter</span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">filter</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000">name</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">3</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #000000">&lt;!-</span>
				<span style="COLOR: #000000">对</span>
				<span style="COLOR: #000000">/</span>
				<span style="COLOR: #000000">testContent.jsp页面内容进行缓存</span>
				<span style="COLOR: #000000">--&gt;</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">4</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">url</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000">pattern</span>
				<span style="COLOR: #000000">&gt;/</span>
				<span style="COLOR: #000000">testContent.jsp</span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">url</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000">pattern</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">5</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">filter</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000">mapping</span>
				<span style="COLOR: #000000">&gt;</span>
		</div>
		<p>
				<br />2. 缓存URL pattern</p>
		<p>修改web.xml，增加如下内容，确定对*.jsp页面进行缓存。</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #008080">1</span>
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">filter</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000">mapping</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">2</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">filter</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000">name</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">CacheFilter</span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">filter</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000">name</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">3</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #000000">&lt;!-</span>
				<span style="COLOR: #000000">对所有jsp页面内容进行缓存</span>
				<span style="COLOR: #000000">--&gt;</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">4</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">url</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000">pattern</span>
				<span style="COLOR: #000000">&gt;*</span>
				<span style="COLOR: #000000">.jsp</span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">url</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000">pattern</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">5</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">filter</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000">mapping</span>
				<span style="COLOR: #000000">&gt;</span>
		</div>
		<p>
				<br />3. 自己设定缓存属性</p>
		<p>在页面级缓存的情况下，可以通过设置CacheFilter的初始属性来决定缓存的一些特性：time属性设置缓存的时间段，默认为3600秒，可以根据自己的需要只有的设置，而scope属性设置，默认为application，可选项包括application、session</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #008080"> 1</span>
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">filter</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080"> 2</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">filter</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000">name</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">CacheFilter</span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">filter</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000">name</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080"> 3</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">filter</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">com.opensymphony.oscache.web.filter.CacheFilter</span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">filter</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080"> 4</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080"> 5</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />     </span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">init</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000">param</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080"> 6</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">param</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000">name</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">time</span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">param</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000">name</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080"> 7</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">param</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000">value</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">600</span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">param</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000">value</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080"> 8</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">init</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000">param</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080"> 9</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080">10</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">init</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000">param</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">11</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">param</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000">name</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">scope</span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">param</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000">name</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">12</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">param</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000">value</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">session</span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">param</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000">value</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">13</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">init</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000">param</span>
				<span style="COLOR: #000000">&gt;<br /></span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">14</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">filter</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">15</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080">16</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080">17</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">filter</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000">mapping</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">18</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">filter</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000">name</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">CacheFilter</span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">filter</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000">name</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">19</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #000000">&lt;!-</span>
				<span style="COLOR: #000000">对所有jsp页面内容进行缓存</span>
				<span style="COLOR: #000000">--&gt;</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">20</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">url</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000">pattern</span>
				<span style="COLOR: #000000">&gt;*</span>
				<span style="COLOR: #000000">.jsp</span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">url</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000">pattern</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">21</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">filter</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000">mapping</span>
				<span style="COLOR: #000000">&gt;</span>
		</div>
		<p>
				<br />5 性能测试结果<br /><br />5.1 测试环境<br />         系统平台：windows 2000 高级服务器/ P3 800 /512M内存<br />         web服务器：websphere 5.0<br />         数据库服务器：mysql 4.0.18-nt</p>
		<p>         性能测试用工具：apache Jmeter</p>
		<p>5.2 测试计划<br />这次性能测试对比方为使用缓存和不使用缓存两种，他们的访问代码都是一样的：通过数据源从本地mysql数据库中获取person表的所有记录，然后显示在页面上。</p>
		<p>测试中将模仿10个用户，每个用户发起5次请求，然后统计所有访问花费的时间。</p>
		<p>5.3 测试结果<br />使用缓存后的测试结果 不使用缓存时的测试结果 </p>
		<p>所有请求花费的总时间(毫秒) 20569 22870 </p>
		<p>性能测试的详细结果请大家查看下载内容中的《不使用cache时的系统性能测试结果.txt》和《使用cache后系统性能测试结果.txt》</p>
		<p>参考资料</p>
		<p>
				<br />OpenSymphony网站中关于OSCache的部分 <a href="http://www.opensymphony.com/oscache/">http://www.opensymphony.com/oscache/</a></p>
		<p>OSCache下载地址 <a href="http://www.opensymphony.com/oscache/download.html">http://www.opensymphony.com/oscache/download.html</a></p>
<img src ="http://www.blogjava.net/liuwentao253/aggbug/64491.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuwentao253/" target="_blank">刘文涛</a> 2006-08-19 10:03 <a href="http://www.blogjava.net/liuwentao253/archive/2006/08/19/64491.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OSCache使用指南 </title><link>http://www.blogjava.net/liuwentao253/archive/2006/08/18/64433.html</link><dc:creator>刘文涛</dc:creator><author>刘文涛</author><pubDate>Fri, 18 Aug 2006 12:34:00 GMT</pubDate><guid>http://www.blogjava.net/liuwentao253/archive/2006/08/18/64433.html</guid><description><![CDATA[
		<span class="content">OSCache是当前运用最广的缓存方案，<br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">JBoss<br /></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />Hibernate<br /></span><span style="COLOR: #008080">3</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />Spring</span></div><br />等都对其有支持，下面简单介绍一下OSCache的配置和使用过程。<br /><br />1.安装过程<br />从<a href="http://www.opensymphony.com/oscache/download.html" target="_blank"><font color="#000000">http://www.opensymphony.com/oscache/download.html</font></a>下载合适的OSCache版本，我下载的是oscache-2.3.1版本。解压缩下载的文件到指定目录,从解压缩目录取得oscache-2.3.1.jar文件放到 /WEB-INF/lib 或相应类库目录 ,从src或etc目录取得oscache.properties 文件，放入src根目录或发布环境的/WEB-INF/classes 目录,<br /><br />如你需要建立磁盘缓存，须修改oscache.properties 中的cache.path信息 (去掉前面的#注释)。<br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">win类路径类似为c:\\app\\cache<br /></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />unix类路径类似为</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">opt</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">myapp</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">cache</span></div><br />2.oscache.properties 文件配置向导 <br /><br />cache.memory值为true 或 false ，默认为在内存中作缓存，如设置为false，那cache只能缓存到数据库或硬盘中，那cache还有什么意义：）<br /><br />cache.capacity : 缓存元素个数<br /><br />cache.persistence.class : 持久化缓存类，如此类打开，则必须设置cache.path信息<br /><br />cache.cluster 相关 : 为集群设置信息。如<br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">cache.cluster.multicast.ip为广播IP地址<br /></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />cache.cluster.properties为集群属性</span></div><br /><br /><br />3.OSCache的基本用法<br /><br />cache1.jsp 内容如下<br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080"> 1</span><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">&lt;%</span><span style="COLOR: #000000">@ page </span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">java.util.*</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">%&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 2</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">&lt;%</span><span style="COLOR: #000000">@ taglib uri</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">oscache</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> prefix</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">cache</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">%&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 3</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">html</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 4</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">body</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 5</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        没有缓存的日期: </span><span style="COLOR: #000000">&lt;%=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> Date() </span><span style="COLOR: #000000">%&gt;&lt;</span><span style="COLOR: #000000">p</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 6</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #000000">&lt;!--</span><span style="COLOR: #000000">自动刷新</span><span style="COLOR: #000000">--&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 7</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">cache:cache time</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">30</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 8</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            每30秒刷新缓存一次的日期: </span><span style="COLOR: #000000">&lt;%=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> Date() </span><span style="COLOR: #000000">%&gt;</span><span style="COLOR: #000000"> <br /></span><span style="COLOR: #008080"> 9</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">cache:cache</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #000000">&lt;!--</span><span style="COLOR: #000000">手动刷新</span><span style="COLOR: #000000">--&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">cache:cache key</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">testcache</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            手动刷新缓存的日期: </span><span style="COLOR: #000000">&lt;%=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> Date() </span><span style="COLOR: #000000">%&gt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">p</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">cache:cache</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">a href</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">cache2.jsp</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">手动刷新</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">a</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">15</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">body</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">16</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">html</span><span style="COLOR: #000000">&gt;</span></div><br />cache2.jsp 执行手动刷新页面如下<br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">&lt;%</span><span style="COLOR: #000000">@ taglib uri</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">oscache</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> prefix</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">cache</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">%&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">html</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">3</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">body</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">4</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        缓存已刷新<img src="http://www.blogjava.net/images/dot.gif" /></span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">p</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">5</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">cache:flush key</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">testcache</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> scope</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">application</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">6</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">a href</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">cache1.jsp</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">返回</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">a</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">7</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">body</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">8</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">html</span><span style="COLOR: #000000">&gt;</span></div><br />你也可以通过下面语句定义Cache的有效范围,如不定义scope,scope默认为Applcation<br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">cache:cache time</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">30</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> scope</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">session</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    <img src="http://www.blogjava.net/images/dot.gif" /><br /></span><span style="COLOR: #008080">3</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">cache:cache</span><span style="COLOR: #000000">&gt;</span></div><br /><br />4. 缓存过滤器 CacheFilter <br /><br />你可以在web.xml中定义缓存过滤器，定义特定资源的缓存。<br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080"> 1</span><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">filter</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 2</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">filter</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">name</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">CacheFilter</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">filter</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">name</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 3</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">filter</span><span style="COLOR: #000000">-</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">com.opensymphony.oscache.web.filter.CacheFilter</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">filter</span><span style="COLOR: #000000">-</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 4</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">init</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">param</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 5</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">param</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">name</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">time</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">param</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">name</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 6</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">param</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">value</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">60</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">param</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">value</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 7</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">init</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">param</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 8</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">init</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">param</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 9</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">param</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">name</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">scope</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">param</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">name</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">param</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">value</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">session</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">param</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">value</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">init</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">param</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">filter</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #008080">15</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #008080">16</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">filter</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">mapping</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">17</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">filter</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">name</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">CacheFilter</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">filter</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">name</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">18</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">url</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">pattern</span><span style="COLOR: #000000">&gt;*</span><span style="COLOR: #000000">.jsp</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">url</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">pattern</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">19</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">filter</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">mapping</span><span style="COLOR: #000000">&gt;</span></div><br />上面定义将缓存所有.jsp页面，缓存刷新时间为60秒，缓存作用域为Session<br /><br />注意: <br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">CacheFilter只捕获Http头为200的页面请求，即只对无错误请求作缓存，<br /></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />而不对其他请求（如500,</span><span style="COLOR: #000000">404</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">400</span><span style="COLOR: #000000">）作缓存处理<br /></span><span style="COLOR: #008080">3</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div></span>
<img src ="http://www.blogjava.net/liuwentao253/aggbug/64433.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuwentao253/" target="_blank">刘文涛</a> 2006-08-18 20:34 <a href="http://www.blogjava.net/liuwentao253/archive/2006/08/18/64433.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用缓冲技术提高JSP应用的性能和稳定性(转载) </title><link>http://www.blogjava.net/liuwentao253/archive/2006/08/17/64187.html</link><dc:creator>刘文涛</dc:creator><author>刘文涛</author><pubDate>Thu, 17 Aug 2006 11:14:00 GMT</pubDate><guid>http://www.blogjava.net/liuwentao253/archive/2006/08/17/64187.html</guid><description><![CDATA[
		<h3>
				<b>一、概述</b>
		</h3>
		<p class="content">在Web应用中，有些报表的生成可能需要数据库花很长时间才能计算出来；有的网站提供天气信息，它需要访问远程服务器<font color="#0000ff"><strong>进行SOAP调用</strong></font>才能得到温度信息。所有这一切都属于复杂信息的例子。在Web页面中加入过多的复杂信息可能导致Web服务器、数据库服务器负荷过重。JSP代码块缓冲为开发者带来了随意地增加各种复杂信息的自由。</p>
		<p class="content">JSP能够在标记库内封装和运行复杂的Java代码，它使得JSP页面文件更容易维护，使得非专业开发人员使用JSP页面文件更加方便。现在已经有许多标记库，它们或者是商业产品，或者是源代码开放产品。但这些产品中的大多数都只是用标记库的形式实现原本可以用一个简单的Java Scriptlet实现的功能，很少有产品以某种创造性的方式使用定制标记，提供在出现JSP定制标记库之前几乎不可能实现的用法。</p>
		<p class="content">OSCache标记库由<a href="http://www.opensymphony.com/oscache/" target="_blank">OpenSymphony</a>设计，它是一种开创性的JSP定制标记应用，提供了在现有JSP页面之内实现快速内存缓冲的功能。虽然已经有一些供应商在提供各种形式的缓存产品，但是，它们都属于面向特定供应商的产品。OSCache能够在任何JSP 1.1兼容的服务器上运行，它不仅能够为所有用户缓冲现有JSP代码块，而且能够以用户为单位进行缓冲。OSCache还包含一些提高可伸缩性的高级特性，比如：缓冲到磁盘，可编程的缓冲刷新，异常控制，等等。另外，正如OpenSymphony的其他产品，OSCache的代码也在一个开放源代码许可协议之下免费发行。</p>
		<p class="content">本文以一个假想的拍卖网站设计过程为例，介绍OSCache的工作过程。这个假想的Web网站将包含：</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">1</span>
				<span style="COLOR: #000000">：一个报告最近拍卖活动的管理页面；<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #000000">2</span>
				<span style="COLOR: #000000">：一个功能完整、带有各种宣传信息的主页；<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #000000">3</span>
				<span style="COLOR: #000000">：一个特殊的导航条,包含了用户所有尚未成交的拍卖活动信息。<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
		</div>
		<p class="content">
				<b>二、管理页面</b>
		</p>
		<p class="content">拍卖网站包含一个管理报表，数据库服务器需要数秒时间才能创建这样一个报表。报表生成时间长这一点很重要，因为我们可能让多个管理员监视系统运行情况，同时又想避免管理员每次访问时都重新生成这个报表。为了实现这一点，我们将把整个页面封装到一个应用级的缓冲标记之内，这个缓冲标记每隔1小时刷新。其他供应商提供的一些产品也具有类似的功能，只是OSCache比它们做得更好。</p>
		<p class="content">为简单计，我们将不过多地关注格式问题。在编写管理页面时，我们首先把标记库声明加入到页面：</p>
		<table style="BORDER-BOTTOM-COLOR: #000000; BORDER-COLLAPSE: collapse; BORDER-RIGHT-COLOR: #000000" bordercolor="#111111" cellspacing="0" cellpadding="5" width="80%" bgcolor="#e9e9e9" border="1">
				<tbody>
						<tr>
								<td class="code">&lt;%@ taglib uri="cachetags" prefix="cache" %&gt;</td>
						</tr>
				</tbody>
		</table>
		<p class="content">接下来我们要用cache标记来包围整个页面。cache标记的默认缓冲时间是1小时。</p>
		<table style="BORDER-BOTTOM-COLOR: #000000; BORDER-COLLAPSE: collapse; BORDER-RIGHT-COLOR: #000000" bordercolor="#111111" cellspacing="0" cellpadding="5" width="80%" bgcolor="#e9e9e9" border="1">
				<tbody>
						<tr>
								<td class="code">&lt;cache:cache&gt; .... 复杂的管理报表 .... &lt;/cache:cache&gt;</td>
						</tr>
				</tbody>
		</table>
		<p class="content">现在管理页面已经被缓冲。如果管理员在页面生成后的一个小时之内再次访问同一页面，他看到的将是以前缓存的页面，不需要由数据库服务器再次生成这个报表。</p>
		<h3>
				<b>三、主页</b>
		</h3>
		<p class="content">拍卖网站的主页显示网站活动情况，宣传那些即将结束的拍卖活动。我们希望显示出正在进行的拍卖活动数量，当前登录用户数量，在短期内就要结束的拍卖活动的清单，以及当前时间。这些信息有着不同的时间精确度要求。网站上的拍卖活动通常持续数天，因此我们可以把缓冲有效拍卖活动数量的时间定为6个小时。用户数量的变化显然要频繁一些，但这里我们将把这个数值每次缓冲15分钟。最后，我们希望页面中显示的当前时间总是精确的页面访问时间。</p>
		<p class="content">在主页中声明标记库之后，我们首先以不带缓冲的方式直接输出当前日期：</p>
		<table style="BORDER-BOTTOM-COLOR: #000000; BORDER-COLLAPSE: collapse; BORDER-RIGHT-COLOR: #000000" bordercolor="#111111" cellspacing="0" cellpadding="5" width="80%" bgcolor="#e9e9e9" border="1">
				<tbody>
						<tr>
								<td class="code">现在是：&lt;%=new java.util.Date()%&gt;</td>
						</tr>
				</tbody>
		</table>
		<p class="content">接下来，我们要显示一个清单，列出那些将在短期内结束的拍卖活动：</p>
		<table style="BORDER-BOTTOM-COLOR: #000000; BORDER-COLLAPSE: collapse; BORDER-RIGHT-COLOR: #000000" bordercolor="#111111" cellspacing="0" cellpadding="5" width="80%" bgcolor="#e9e9e9" border="1">
				<tbody>
						<tr>
								<td class="code">&lt;cache:cache&gt; &lt;ul&gt; &lt;% // 构造一个包含最近拍卖活动的Iterator Iterator auctions = .... while (auctions.hasMore()) { Auction auction = (Auction)auctions.next(); %&gt;&lt;li&gt;&lt;%=auction%&gt;&lt;/li%&lt; } %&gt; &lt;/ul&gt; &lt;/cache:cache&gt;</td>
						</tr>
				</tbody>
		</table>
		<p class="content">最后，我们希望显示出正在进行的拍卖活动的数量，这个数字需要缓冲6小时。由于cache标记需要的是缓冲数据的秒数，我们把6小时转换成21600秒：</p>
		<table style="BORDER-BOTTOM-COLOR: #000000; BORDER-COLLAPSE: collapse; BORDER-RIGHT-COLOR: #000000" bordercolor="#111111" cellspacing="0" cellpadding="5" width="80%" bgcolor="#e9e9e9" border="1">
				<tbody>
						<tr>
								<td class="code">&lt;cache:cache time="21600"&gt; &lt;% //查询数据库得到拍卖活动总数 int auctionCount = .... %&gt; 本网站正在进行的拍卖活动有&lt;%=auctionCount%&gt;个! &lt;/cache&gt;</td>
						</tr>
				</tbody>
		</table>
		<p class="content">可以看到，我们只用少量的代码就构造出了一个带有复杂缓冲系统的主页。这个缓冲系统对页面各个部分分别进行缓冲，而且各个部分的缓冲时间完全符合它们各自的信息变化频繁程度。由于有了缓冲，现在我们可以在主页中放入更多的内容；而在以前没有缓冲的情况下，主页中放入过多的内容会导致页面访问速度变慢，甚至可能给数据库服务器带来过重的负载。</p>
		<h3>
				<b>四、导航条</b>
		</h3>
		<p class="content">假设在规划网站的时候，我们决定在左边导航条的下方显示购物车内容。我们将显示出用户所拍卖的每一种商品的出价次数和当前报价，以及所有那些当前用户出价最高的商品的清单。</p>
		<p class="content">我们利用会话级的缓冲能力在导航条中构造上述功能。把下面的代码放入模板或者包含文件，以便网站中的其他页面引用这个导航条：</p>
		<table style="BORDER-BOTTOM-COLOR: #000000; BORDER-COLLAPSE: collapse; BORDER-RIGHT-COLOR: #000000" bordercolor="#111111" cellspacing="0" cellpadding="5" width="80%" bgcolor="#e9e9e9" border="1">
				<tbody>
						<tr>
								<td class="code">&lt;cache:cache key="navbar" scope="session" time="300"&gt; &lt;% //提取并显示当前的出价信息 %&gt; &lt;/cache:cache&gt;</td>
						</tr>
				</tbody>
		</table>
		<p class="content">在这里我们引入了两个重要的属性，即key和scope。在本文前面的代码中，由于cache标记能够自动为代码块创建唯一的key，所以我们不需要手工设置这个key属性。但在这里，我们想要从网站的其余部分引用这个被缓冲的代码块，因此我们显式定义了该cache标记的key属性。第二，scope属性用来告诉cache标记当前代码块必须以用户为单位缓冲，而不是为所有用户缓冲一次。</p>
		<p class="content">
				<font color="#0000ff">
						<strong>在使用会话级缓冲时应该非常小心，应该清楚：虽然我们可以让复杂的导航条减少5倍或10倍的服务器负载，但它将极大地增加每个会话所需要的内存空间</strong>
				</font>。在CPU能力方面增加可能的并发用户数量无疑很理想，但是，一旦在内存支持能力方面让并发用户数量降低到了CPU的限制之下，这个方案就不再理想。</p>
		<p class="content">正如本文前面所提到的，我们希望从网站的其余部分引用这个缓冲的代码块。这是因为，当一个用户增加了一个供拍卖的商品、或者出价竞购其他用户拍卖的商品时，我们希望刷新缓冲，使得导航条下一次被读取时具有最新的内容。虽然这些数据可能因为其他用户的活动而改变，但如果用户在网站上执行某个动作之后看到自己的清单仍未改变，他可能会感到非常困惑。</p>
		<p class="content">OSCache库提供的flush标记能够刷新缓冲内容。我们可以把下面的代码加入到处理用户动作且可能影响这一区域的页面之中：</p>
		<table style="BORDER-BOTTOM-COLOR: #000000; BORDER-COLLAPSE: collapse; BORDER-RIGHT-COLOR: #000000" bordercolor="#111111" cellspacing="0" cellpadding="5" width="80%" bgcolor="#e9e9e9" border="1">
				<tbody>
						<tr>
								<td class="code">&lt;cache:flush key="navbar" scope="session" /&gt;</td>
						</tr>
				</tbody>
		</table>
		<p class="content">当用户下次访问它时，navbar缓冲块将被刷新。</p>
		<p class="content">至此为止，我们这个示例网站的构造工作已经完成且可以开始运行。下面我们来看看OSCache的异常处理能力。即使缓冲的内容已经作废，比如在缓冲块内出现了Java异常，OSCache标记库仍旧允许我们用编程的方法显示这些内容。有了这种异常控制功能，我们可以拆除数据库服务器和Web服务器之间的连接，而网站仍能够继续运行。JSP 1.2规范引入了TryCatchFinally接口，这个接口允许标记本身检测和处理Java异常。因此，标记可以结合这种异常处理代码，使得JSP页面更简单、更富有条理。</p>
		<p class="content">OpenSymphony正在计划实现其他的缓冲机制以及一个可管理性更好的主系统，它将使我们能够对缓冲使用的RAM和磁盘空间进行管理。一旦有了这些功能，我们就能够进一步提高网站的响应速度和可靠性。</p>
		<p class="content">使用范例:</p>
		<p class="content">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中定义缓存过滤器，定义特定资源的缓存。</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #008080"> 1</span>
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">filter</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080"> 2</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">filter</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000">name</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">CacheFilter</span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">filter</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000">name</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080"> 3</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">filter</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">com.opensymphony.oscache.web.filter.CacheFilter</span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">filter</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080"> 4</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">init</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000">param</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080"> 5</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">param</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000">name</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">time</span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">param</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000">name</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080"> 6</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">param</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000">value</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">60</span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">param</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000">value</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080"> 7</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">init</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000">param</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080"> 8</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">init</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000">param</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080"> 9</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">param</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000">name</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">scope</span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">param</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000">name</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">10</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">param</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000">value</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">session</span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">param</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000">value</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">11</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">init</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000">param</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">12</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">filter</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">13</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080">14</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080">15</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">filter</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000">mapping</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">16</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">filter</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000">name</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">CacheFilter</span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">filter</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000">name</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">17</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">url</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000">pattern</span>
				<span style="COLOR: #000000">&gt;*</span>
				<span style="COLOR: #000000">.jsp</span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">url</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000">pattern</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">18</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">filter</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000">mapping</span>
				<span style="COLOR: #000000">&gt;</span>
		</div>
		<p class="content">上面定义将缓存所有.jsp页面，缓存刷新时间为60秒，缓存作用域为Session<br /><br />注意，<font color="#0000ff"><strong>CacheFilter只捕获Http头为200的页面请求</strong></font>，即只对无错误请求作缓存，<br />而不对其他请求（如500,404,400）作缓存处理</p>
		<p class="content">
				<font color="#008080">【结束语】</font>OSCache能够帮助我们构造出更丰富多彩、具有<font color="#0000ff"><strong>更高性能的网站</strong></font>。有了OSCache标记库的帮助，现在我们能够用它解决一些影响网站响应能力的问题，<font color="#0000ff"><strong>比如访问量高峰期、数据库服务器负荷过重</strong></font>等。</p>
		<p class="content">个人提示：如果你使用Struts或者其它mvc架构很难享受到oscache tag带来的性能提高，因为每一次请求还是要提交到action--dao-or othere thing去处理，因此，要使用缓存，就需要其它手段，<font color="#0000ff"><strong>如在spring的拦截器做方法级的缓存</strong></font>.....,如果你所有的的业务处理代码是写在jsp页面中，就可以使用cache tag来缓存前面产生的页面数据，避免做相同的业务操作.</p>
		<p id="TBPingURL"> </p>
<img src ="http://www.blogjava.net/liuwentao253/aggbug/64187.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuwentao253/" target="_blank">刘文涛</a> 2006-08-17 19:14 <a href="http://www.blogjava.net/liuwentao253/archive/2006/08/17/64187.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>