﻿<?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-佛脚-文章分类-opensymphony</title><link>http://www.blogjava.net/gen-sky/category/40687.html</link><description>终日昏昏醉梦间，忽闻春尽强登山，  因过竹院逢僧话，偷得浮生半日闲。</description><language>zh-cn</language><lastBuildDate>Wed, 08 Jul 2009 06:39:27 GMT</lastBuildDate><pubDate>Wed, 08 Jul 2009 06:39:27 GMT</pubDate><ttl>60</ttl><item><title>[转] osCache内部介绍 </title><link>http://www.blogjava.net/gen-sky/articles/285823.html</link><dc:creator>星期五</dc:creator><author>星期五</author><pubDate>Tue, 07 Jul 2009 07:22:00 GMT</pubDate><guid>http://www.blogjava.net/gen-sky/articles/285823.html</guid><wfw:comment>http://www.blogjava.net/gen-sky/comments/285823.html</wfw:comment><comments>http://www.blogjava.net/gen-sky/articles/285823.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gen-sky/comments/commentRss/285823.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gen-sky/services/trackbacks/285823.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 转自：http://blog.csdn.net/furthersun/archive/2008/09/19/2952329.aspx</p>
<p>1、摘要 <br />
本文档介绍了如何在 Portlet 应用中使用 OSCache 进行页面内容缓存和对象缓存，分析了 OSCache
的实现原理，并提出了一个用来缓存对象和页面的简单易用的方案。本文档不涉及 OSCache 的安装与配置的内容，相关内容请参考 OSCache
的 在线文档 。 </p>
<p>2、 OSCache 简介 <br />
OSCache标记库由OpenSymphony设计，它是一种开创性的缓存方案，它提供了在现有JSP页面之内实现内存缓存的功能。OSCache是个一个被广泛采用的高性能的J2EE缓存框架，OSCache还能应用于任何Java应用程序的普通的缓存解决方案。 </p>
<p>OSCache有以下特点： </p>
<p>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 缓存任何对象：你可以不受限制的缓存部分jsp页面或HTTP请求，任何java对象都可以缓存。 </p>
<p>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 拥有全面的API：OSCache API允许你通过编程的方式来控制所有的OSCache特性。 </p>
<p>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 永久缓存：缓存能被配置写入硬盘，因此允许在应用服务器的多次生命周期间缓存创建开销昂贵的数据。 </p>
<p>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 支持集群：集群缓存数据能被单个的进行参数配置，不需要修改代码。 </p>
<p>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 缓存过期：你可以有最大限度的控制缓存对象的过期，包括可插入式的刷新策略（如果默认性能不能满足需要时）。 </p>
<p>3、OSCache 缓存原理简介&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Cache Factory&nbsp;<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Cache Proxy&nbsp;<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Cache Map&nbsp;<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Memory&nbsp;<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Disk&nbsp;<br />
&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Listeners&nbsp;<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Cache Entry <br />
&nbsp;</p>
<p>图 3-1 OSCache 架构概览 </p>
<p>Cache Factory ：该实体负责获得 Cache Proxy ，兼有一些对 Cache Proxy 的管理功能。对应到现在的
OSCache 实现中的类是： GeneralCacheAdministrator 和 ServletCacheAdministrator 。
</p>
<p>Cache Proxy ：该实体是 Cache Map 的代理，它主要负责从 Cache Map 中取得 /
存储指定的缓存对象，如果缓存对象过期，那么就将缓存刷新，并向指定的监听者发送存 / 取事件。对应到现在的 OSCache 实现中的类是：
Cache 和 ServletCache 。 </p>
<p>Cache Map ：该实体存储了所有的缓存实体，是一个 OSCache 专有的 Map
实现，它能根据指定的算法清除缓存，以及将缓存持久化到磁盘中。对应到现在的 OSCache 实现中的类是： FIFOCache ，
LRUCache 和 UnlimitedCache 。 </p>
<p>Listeners ： OSCache 存 / 取事件的监听者实体。对应到现在的 OSCache 实现中的类是： CacheEntryEventListener 和 CacheMapAccessEventListener 。 </p>
<p>Cache Entry ：表示缓存对象的包装实体，它包装了缓存对象和刷新策略。对应到现在的 OSCache 实现中的类是： CacheEntry 。 </p>
<p>3.1&nbsp;&nbsp;应用场景 <br />
一个典型的&#8220;缓存对象&#8221;场景是： </p>
<p>应用调用 Cache Factory 获得 Cache Proxy ，然后应用将要缓存的对象以及刷新策略通过 Cache Proxy 存储到 Cache Map 中，并通知各个 Listener 。 </p>
<p>一个典型的&#8220;取得缓存对象&#8221;的场景是： </p>
<p>应用调用 Cache Factory 获得 Cache Proxy ，然后给 Cache Proxy 的相应方法传入要获得的缓存对象的
key ， Cache Proxy
会根据指定的刷新策略判断缓存是否过期，如果缓存没有过期，则返回缓存对象，如果缓存过期，则刷新缓存，并向应用层抛出需要刷新的异常（
NeedsRefreshException ），应用如果收到此异常，将重新计算内容并将内容缓存。 </p>
<p>4、Web 应用中的缓存方案 <br />
4.1&nbsp;&nbsp;假定 <br />
OSCache 现有的缓存刷新策略（超过指定时间后自动过期，超过指定日期后自动过期，按照克龙表达式的设定自动过期）不能满足需求。现有应用要求：当数据源的部分内容更新后，能够使相关缓存过期，展现页面从数据源取得更新的内容显示。 </p>
<p>4.2、方案应用场景 <br />
该方案为下列场景提供了支持： </p>
<p>1． 缓存整个 Response ，能够定制刷新指定的 Response 。 </p>
<p>2． 缓存 JSP 页面内容，能够定制刷新指定的缓存内容。 </p>
<p>3． 缓存对象，能够定制刷新指定的缓存对象。 </p>
<p>4.3、 配置 <br />
4.3.1&nbsp; 配置 ***CacheFilter <br />
在 Web 应用的 web.xml 中添加下面的内容： </p>
<p>&lt; filter&gt; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; filter-name&gt;CacheFilter&lt;/filter-name&gt; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; filter-class&gt; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; com.***.portal.oscache.***CacheFilter </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/ filter-class&gt; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; init-param&gt; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; param-name&gt;time&lt;/param-name&gt; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; param-value&gt;-1&lt;/param-value&gt; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/ init-param&gt; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; init-param&gt; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; param-name&gt;scope&lt;/param-name&gt; </p>
<p>定制这个 fileter 缓存的 response 的组 <br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; param-value&gt;application&lt;/param-value&gt; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/ init-param&gt; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;init-param&gt; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;groups&lt;/param-name&gt; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt; landy &lt;/param-value&gt; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/init-param&gt; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/ filter&gt; </p>
<p>&lt; filter-mapping&gt; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; filter-name&gt;CacheFilter&lt;/filter-name&gt; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; url-pattern&gt;/ landy &lt;/ url-pattern&gt; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/ filter-mapping&gt; <br />
&nbsp;</p>
<p>注意： </p>
<p>为了在部分数据更新时只刷新部分 Response ， ***CacheFilter 比 OSCache 提供的 CacheFitler
增加了一个可配置的参数：&#8220; groups &#8221;，部署者可以通过这个参数配置这个 filter 所映射的 URLS 的组（通常同一个组的 URL
会从同时更新的数据源取数据），这样当数据源某部分更新之后，我们就可以刷新从这部分数据源取数据的 URLs
。该配置项支持配置多个组，以逗号作为分隔符，如：&#8220; group1,group2 &#8221;。 </p>
<p>其他的配置项说明请参考 OSCache 在线文档的 CacheFilter 配置部分 。 </p>
<p>4.4、缓存整个 Response <br />
OSCache 提供的 CacheFilter 能够缓存 Response ，但不能供应用选择性的刷新某些 Response ，而 ***CacheFilter 就能支持这一特性。 </p>
<p>4.4.1&nbsp;使用方法 <br />
您可以按照以下的方式刷新某一组（ Filter 初始化参数中 groups 参数配置的内容）的 Responses: </p>
<p>ServletCacheAdministrator admin = null; </p>
<p>Filter 初始化参数中 scope 参数配置的内容&nbsp;<br />
admin = ServletCacheAdministrator.getInstance(config </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .getServletContext()); </p>
<p>Filter 初始化参数中 groups 参数配置的内容 <br />
Cache cache = admin.getCache(httpRequest, cacheScope); </p>
<p>cache. flushGroup(group); <br />
&nbsp;</p>
<p>4.4.2&nbsp;&nbsp;&nbsp;约束 <br />
这种方案仅适用于普通的 web 应用，不适用于 Portlets 应用，因为在 Portlets
应用中，每个 Portlet 都是页面上一个可插拔的组件，如果被缓存的 Response 代表的页面中某个 Portlet
被删除了，那么这个页面产生的 Response 就会不一样，而这时应用却无法刷新缓存的 Response 。 </p>
<p>4.5、 缓存 JSP 页面内容 <br />
可以在 JSP 页面中将要缓存的内容置于 &lt;cache&gt;&lt;/cache&gt; 标签之间，当更新数据源的事件产生时，在处理事件的方法中加入如下代码即可： </p>
<p>***OSCacheUtil.getInstance().flushGroup("group1"); <br />
&nbsp;</p>
<p>4.5.1&nbsp;样例 <br />
我要缓存一个从数据源的 A 表取数据的 JSP 内容段，如下表所示： </p>
<p>&lt;oscache:cache key="foobar" scope="application" time="-1" groups="group1" &gt; </p>
<p>//business code </p>
<p>Select * from table A and Display </p>
<p>&lt;/oscache:cache&gt; <br />
&nbsp;</p>
<p>数据源更新了，在处理数据更新事件的代码中，我加入下表的代码： </p>
<p>***OSCacheUtil.getInstance().flushGroup("group1"); <br />
&nbsp;</p>
<p>这样就可以刷新缓存的 group1 组的数据了。 </p>
<p>4.5.2&nbsp;&nbsp;约束 <br />
本方案在满足了 4.1 描述的需求的条件下，仅支持选择性的刷新存储在 application 域（
cache 标签中 scope 属性配置为 application ）的缓存。为什么不支持选择性的刷新 session
域的缓存呢？是因为数据更新的事件产生是随机的，当数据更新事件发生时，我们无法得到 web 服务器中的每个 session
，所以不能支持选择性的刷新 session 域的缓存。 </p>
<p>4.6、缓存对象 <br />
可以在 web 应用的业务处理逻辑中将要缓存的对象采用如下的方式将对象缓存到 application 域中： </p>
<p>***OSCacheUtil.getInstance().putInCache(key, content, new String[]{&#8220;group1&#8221;}); <br />
&nbsp;</p>
<p>当更新数据源的事件产生时，在处理事件的方法中加入如下代码即可： </p>
<p>***OSCacheUtil.getInstance().flushGroup("group1"); <br />
&nbsp;</p>
<p>4.6.1&nbsp; 约束 <br />
同 4.5.2 一致。 </p>
<p>5、Demo <br />
5.1&nbsp;&nbsp;方案框架 <br />
包括 ***CacheFilter 和 ***OSCacheUtil 。 </p>
<br />
5.2&nbsp;&nbsp;测试用例（基于 portlet ） <br />
用例 src ： <br />
用例 ear ：
<img src ="http://www.blogjava.net/gen-sky/aggbug/285823.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gen-sky/" target="_blank">星期五</a> 2009-07-07 15:22 <a href="http://www.blogjava.net/gen-sky/articles/285823.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(转)在Spring框架中使用OSCache缓存</title><link>http://www.blogjava.net/gen-sky/articles/285816.html</link><dc:creator>星期五</dc:creator><author>星期五</author><pubDate>Tue, 07 Jul 2009 06:51:00 GMT</pubDate><guid>http://www.blogjava.net/gen-sky/articles/285816.html</guid><wfw:comment>http://www.blogjava.net/gen-sky/comments/285816.html</wfw:comment><comments>http://www.blogjava.net/gen-sky/articles/285816.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gen-sky/comments/commentRss/285816.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gen-sky/services/trackbacks/285816.html</trackback:ping><description><![CDATA[<p><span style="font-family: 宋体;">
<p style="margin: 0cm 0cm 0pt;"><span style="font-family: 宋体;">在</span><span style="font-family: Times New Roman;">Spring</span><span style="font-family: 宋体;">框架中使用</span><span style="font-family: Times New Roman;">OSCache</span><span style="font-family: 宋体;">缓存</span></p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-family: Times New Roman;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体;">就是使用</span><span style="font-family: Times New Roman;">Spring</span><span style="font-family: 宋体;">提供的</span><span style="font-family: Times New Roman;">springmodules</span><span style="font-family: 宋体;">和</span><span style="font-family: Times New Roman;">OSCache</span><span style="font-family: 宋体;">来简化程序的开发，通过配置文件来完成提供缓存。参考</span><span style="font-family: Times New Roman;">springmodules</span><span style="font-family: 宋体;">的文档。</span></p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-family: Times New Roman;">1</span><span style="font-family: 宋体;">、创建</span><span style="font-family: Times New Roman;">Spring OSCache</span><span style="font-family: 宋体;">的配置</span><span style="font-family: Times New Roman;">xml</span><span style="font-family: 宋体;">文件</span></p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-family: Times New Roman;">2</span><span style="font-family: 宋体;">、<span style="color: #626262;">将</span></span><span style="color: #626262;"><span style="font-family: Times New Roman;">oscache.properties</span></span><span style="color: #626262; font-family: 宋体;">、</span><span style="color: #626262;"><span style="font-family: Times New Roman;">oscache.tld</span></span><span style="color: #626262; font-family: 宋体;">放入</span><span style="color: #626262;"><span style="font-family: Times New Roman;">WEB-INF"class</span></span><span style="color: #626262; font-family: 宋体;">目录，</span><span style="font-family: 宋体;">并修改属性文件的参数</span></p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-family: 宋体;">下边</span><span style="font-family: Times New Roman;">Spring OSCache</span><span style="font-family: 宋体;">配置信息来自</span><a href="http://www.javaeye.com/problems/7493"><span style="font-family: Times New Roman;">http://www.javaeye.com/problems/7493</span></a></p>
</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">&lt;?</span><span style="font-size: 10pt; color: #3f7f7f; font-family: &quot;Courier New&quot;;">xml </span><span style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;;">version</span><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;;">"1.0" </span><span style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;;">encoding</span><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;;">"UTF-8" </span><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">?&gt;</span><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">&lt;!</span><span style="font-size: 10pt; color: #3f7f7f; font-family: &quot;Courier New&quot;;">DOCTYPE </span><span style="font-size: 10pt; color: navy; font-family: &quot;Courier New&quot;;">beans </span><span style="font-size: 10pt; color: gray; font-family: &quot;Courier New&quot;;">PUBLIC </span><span style="font-size: 10pt; color: navy; font-family: &quot;Courier New&quot;;">"-//SPRING//DTD BEAN//EN" </span><span style="font-size: 10pt; color: #3f7f5f; font-family: &quot;Courier New&quot;;">"http://www.springframework.org/dtd/spring-beans.dtd"</span><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">&gt;</span><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: &quot;Courier New&quot;;">beans</span><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">&gt;</span><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: &quot;Courier New&quot;;">bean </span><span style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;;">id</span><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;;">"cacheManager"&nbsp;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;;">class</span><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;;">"org.springmodules.cache.provider.oscache.OsCacheManagerFactoryBean"</span><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">&gt;</span><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: #3f5fbf; font-family: &quot;Courier New&quot;;">&lt;!-- Optional properties --&gt;</span><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: &quot;Courier New&quot;;">property </span><span style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;;">name</span><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;;">"configLocation" </span><span style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;;">value</span><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;;">"classpath:oscache_config.properties"</span><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">/&gt;</span><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">&lt;/</span><span style="font-size: 10pt; color: #3f7f7f; font-family: &quot;Courier New&quot;;">bean</span><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">&gt;</span><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: &quot;Courier New&quot;;">bean </span><span style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;;">id</span><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;;">"cacheProviderFacade"&nbsp;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;;">class</span><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;;">"org.springmodules.cache.provider.oscache.OsCacheFacade"</span><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">&gt;</span><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: &quot;Courier New&quot;;">property </span><span style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;;">name</span><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;;">"cacheManager" </span><span style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;;">ref</span><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;;">"cacheManager"</span><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">/&gt;</span><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">&lt;/</span><span style="font-size: 10pt; color: #3f7f7f; font-family: &quot;Courier New&quot;;">bean</span><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">&gt;</span><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">&nbsp;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: &quot;Courier New&quot;;">bean </span><span style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;;">id</span><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;;">"cacheKeyGenerator" </span><span style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;;">class</span><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;;">"org.springmodules.cache.key.HashCodeCacheKeyGenerator"</span><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">/&gt;</span><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">&nbsp;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: &quot;Courier New&quot;;">bean </span><span style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;;">id</span><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;;">"userDaoProxy"&nbsp;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;;">class</span><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;;">"org.springmodules.cache.interceptor.proxy.CacheProxyFactoryBean"</span><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">&gt;</span><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: &quot;Courier New&quot;;">property </span><span style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;;">name</span><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;;">"cacheProviderFacade" </span><span style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;;">ref</span><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;;">"cacheProviderFacade"</span><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">/&gt;</span><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: &quot;Courier New&quot;;">property </span><span style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;;">name</span><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;;">"cacheKeyGenerator" </span><span style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;;">ref</span><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;;">"cacheKeyGenerator"</span><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">/&gt;</span><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: &quot;Courier New&quot;;">property </span><span style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;;">name</span><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;;">"cachingModels"</span><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">&gt;</span><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: &quot;Courier New&quot;;">props</span><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">&gt;</span><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: &quot;Courier New&quot;;">prop </span><span style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;;">key</span><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;;">"get*"</span><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">&gt;</span><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">refreshPeriod=12;groups=user</span><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">&lt;/</span><span style="font-size: 10pt; color: #3f7f7f; font-family: &quot;Courier New&quot;;">prop</span><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">&gt;</span><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">&lt;/</span><span style="font-size: 10pt; color: #3f7f7f; font-family: &quot;Courier New&quot;;">props</span><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">&gt;</span><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">&lt;/</span><span style="font-size: 10pt; color: #3f7f7f; font-family: &quot;Courier New&quot;;">property</span><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">&gt;</span><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: &quot;Courier New&quot;;">property </span><span style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;;">name</span><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;;">"flushingModels"</span><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">&gt;</span><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: &quot;Courier New&quot;;">props</span><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">&gt;</span><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: &quot;Courier New&quot;;">prop </span><span style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;;">key</span><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;;">"update*"</span><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">&gt;</span><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">groups=user</span><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">&lt;/</span><span style="font-size: 10pt; color: #3f7f7f; font-family: &quot;Courier New&quot;;">prop</span><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">&gt;</span><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: &quot;Courier New&quot;;">prop </span><span style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;;">key</span><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;;">"delete*"</span><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">&gt;</span><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">groups=user</span><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">&lt;/</span><span style="font-size: 10pt; color: #3f7f7f; font-family: &quot;Courier New&quot;;">prop</span><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">&gt;</span><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: &quot;Courier New&quot;;">prop </span><span style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;;">key</span><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;;">"add*"</span><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">&gt;</span><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">groups=user</span><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">&lt;/</span><span style="font-size: 10pt; color: #3f7f7f; font-family: &quot;Courier New&quot;;">prop</span><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">&gt;</span><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">&lt;/</span><span style="font-size: 10pt; color: #3f7f7f; font-family: &quot;Courier New&quot;;">props</span><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">&gt;</span><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">&lt;/</span><span style="font-size: 10pt; color: #3f7f7f; font-family: &quot;Courier New&quot;;">property</span><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">&gt;</span><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">&nbsp;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: &quot;Courier New&quot;;">property </span><span style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;;">name</span><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;;">"cachingListeners"</span><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">&gt;</span><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: &quot;Courier New&quot;;">list</span><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">&gt;</span><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: #3f5fbf; font-family: &quot;Courier New&quot;;">&lt;!--ref bean="cachingListener" /--&gt;</span><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">&lt;/</span><span style="font-size: 10pt; color: #3f7f7f; font-family: &quot;Courier New&quot;;">list</span><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">&gt;</span><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">&lt;/</span><span style="font-size: 10pt; color: #3f7f7f; font-family: &quot;Courier New&quot;;">property</span><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">&gt;</span><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: &quot;Courier New&quot;;">property </span><span style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;;">name</span><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;;">"target" </span><span style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;;">ref</span><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;;">"userDaoTarget"</span><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">/&gt;</span><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">&lt;/</span><span style="font-size: 10pt; color: #3f7f7f; font-family: &quot;Courier New&quot;;">bean</span><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">&gt;</span><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">&nbsp;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">&nbsp;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp; </span><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: &quot;Courier New&quot;;">bean </span><span style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;;">id</span><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;;">"userDaoTarget" </span><span style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;;">class</span><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;;">"com.logictown.BHT.dao.springJdbc.UserDaoImpl"</span><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">&gt;</span><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: &quot;Courier New&quot;;">property </span><span style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;;">name</span><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;;">"dataSource" </span><span style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;;">ref</span><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;;">"dataSource"</span><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">/&gt;</span><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">&lt;/</span><span style="font-size: 10pt; color: #3f7f7f; font-family: &quot;Courier New&quot;;">bean</span><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">&gt;</span><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">&nbsp;</span></p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">&lt;/</span><span style="font-size: 10pt; color: #3f7f7f; font-family: &quot;Courier New&quot;;">beans</span><span style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;;">&gt;</span><span style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;;">&nbsp;</span></p>
<p><br />
</p>
<img src ="http://www.blogjava.net/gen-sky/aggbug/285816.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gen-sky/" target="_blank">星期五</a> 2009-07-07 14:51 <a href="http://www.blogjava.net/gen-sky/articles/285816.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]应用OSCache提升J2EE系统运行性能</title><link>http://www.blogjava.net/gen-sky/articles/285811.html</link><dc:creator>星期五</dc:creator><author>星期五</author><pubDate>Tue, 07 Jul 2009 06:43:00 GMT</pubDate><guid>http://www.blogjava.net/gen-sky/articles/285811.html</guid><wfw:comment>http://www.blogjava.net/gen-sky/comments/285811.html</wfw:comment><comments>http://www.blogjava.net/gen-sky/articles/285811.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gen-sky/comments/commentRss/285811.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gen-sky/services/trackbacks/285811.html</trackback:ping><description><![CDATA[Cache是一种用于提高系统响应速度、改善系统运行性能的技术。尤其是在Web应用中，通过缓存页面的输出结果，可以很显著的改善系统运行性能。本文中
作者给大家介绍一个实现J2EE框架中Web应用层缓存功能的开放源代码项目----OSCache。通过应用OSCache，我们不但可以实现通常的
Cache功能，还能够改善系统的稳定性。<br />
<br />
1.1
需要处理的特殊动态内容 <br />
<br />
<br />
在信息系统建设过程中我们通常会遇到这样的问题： <br />
<br />
1. 基础数据的变更问题
<br />
<br />
信息系统中需要处理的基础数据的内容短时间内是不会发生变化的，但是在一个相对长一些的时间里，它却可能是动态增加或者减少的。
<br />
<br />
举个例子：电子商务中关于送货区域的定义，可能短时间内不会发生变化，但是随着电子商务企业业务的扩大，系统中需要处理的送货区域就可能
增加。所以我们的系统中不得不在每次向客户展示送货区域信息的时候都和数据库（假设送货区域信息保存在数据库中，这也是通常采用的处理方法）进行交互。
<br />
<br />
2. 统计报表（不仅限于统计报表）的问题
<br />
<br />
一般来说，统计报表是一个周期性的工作，可能是半个月、一个月或者更长的时间才会需要更新一次，然而统计报表通常是图形显示或者是生成pdf、word、excel等格式的文件，这些图形内容、文件的生成通常需要消耗很多的系统资源，给系统运行造成很大的负担。
<br />
<br />
1.2 问题的共同点 <br />
<br />
<br />
通过比较分析，不难发现这两类问题有一些共同点：
<br />
<br />
1、被处理的内容短时间不变，所以短时间内可以作为静态内容进行处理
<br />
<br />
2、在一个不太长的时间内，被处理的内容可能或者必定产生变化，所以必须将他们作为动态内容进行处理
<br />
<br />
3、在合理的时间区段内可以忽略被处理内容变化后带来的影响 <br />
<br />
4、对这些内容的处理动作比较消耗系统性能，影响系统响应时间
<br />
<br />
1.3 解决方法 <br />
<br />
<br />
缓存技术可以帮助我们很好的解决这个问题： <br />
<br />
1、缓存信息
<br />
<br />
当上述的基础数据或者统计报表第一次被访问时，被处理的内容被当作动态信息，基础数库从数据库中获得，统计报表也会被生成符合要求的图形、文件，然后这些信息都会被放入缓存信息中。
<br />
<br />
2、响应信息由缓存提供
<br />
<br />
当上述的基础数据或者统计报表继续被访问时，系统将会首先检查缓存信息中是否有对应的内容和我们设定的缓存规则，如果符合缓存信息存在而且符合缓存规则，给出的响应将来自于缓存信息，如果没有或者缓存信息已经不符合设定的要求，系统将重复上一步的动作。
<br />
<br />
很显然，上面的步骤2中，多数情况下，当用户请求到达时，被处理的内容将来自于缓存，所以大大的减少了与数据库的交互，或者不再需要为每个请求都生成一次报表图形或者文件，这部分工作的减少对于降低系统性能消耗、提高系统稳定性和并发处理能力是非常有益的。
<br />
<br />
2 OSCache简介
<br />
<br />
<br />
OSCache是OpenSymphony组织提供的一个J2EE架构中Web应用层的缓存技术实现组件，它的出现解决了我们面临的问题。
OSCache目前最新的稳定版本是2.0，本文中的例子都是基于这个版本的，如果大家运行例子的过程中发生问题，请首先确认是否采用了正确的软件版本。
<br />
<br />
2.1 主要特征 <br />
<br />
<br />
1. 兼容多种支持JSP的web服务器
<br />
<br />
已经通过兼容测试的web服务器包括OrionServer (1.4.0或者以上版本) 、Macromedia JRun (3.0或者以上版本)
、BEA Weblogic (7.x或者以上版本) 、IBM Websphere (5.0版本)、Silverstream (3.7.4版本)、Caucho
Resin (1.2.3或者以上版本)、Tomcat (4.0或者以上版本)
，其他支持servlet2.3、jsp1.2的web服务器应该都是完全兼容OSCache的。 <br />
<br />
2. 可选的缓存区
<br />
<br />
你可以使用内存、硬盘空间、同时使用内存和硬盘或者提供自己的其他资源（需要自己提供适配器）作为缓存区。
<br />
<br />
使用内存作为缓存区将可以提供更好的性能 <br />
使用硬盘作为缓存区可以在服务器重起后迅速恢复缓存内容
<br />
同时使用内存和硬盘作为缓存区则可以减少对内存的占用 <br />
3. 灵活的缓存系统
<br />
<br />
OSCache支持对部分页面内容或者对页面级的响应内容进行缓存，编程者可以根据不同的需求、不同的环境选择不同的缓存级别。 <br />
<br />
4.
容错
<br />
<br />
在一般的web应用中，如果某个页面需要和数据库打交道，而当客户请求到达时，web应用和数据库之间无法进行交互，那么将返回给用户"
系统出错"或者类似的提示信息，如果使用了OSCache的话，你可以使用缓存提供给用户，给自己赢得维护系统或者采取其他补救的时间。 <br />
<br />
其它特性还包括对集群的支持、缓存主动刷新等特性，大家可以参考OpenSymphony网站上的其他资源获取更多的信息。 <br />
<br />
3
OSCache组件的安装 <br />
<br />
<br />
OSCache是一个基于web应用的组件，他的安装工作主要是对web应用进行配置，大概的步骤如下：
<br />
<br />
1. 下载、解压缩OSCache
<br />
<br />
请到OSCache的主页http://www.opensymphony.com/oscache/download.html下载Oscache的最新版本，作者下载的是OSCache的最新稳定版本2.0。
<br />
<br />
将下载后的。Zip文件解压缩到c:"oscache（后面的章节中将使用%OSCache_Home%来表示这个目录）目录下 <br />
<br />
2.
新建立一个web应用 <br />
<br />
3. 将主要组件%OSCache_Home%"oscache.jar放入WEB-INF"lib目录 <br />
<br />
4.
commons-logging.jar、commons-collections.jar的处理 <br />
<br />
OSCache组件用Jakarta Commons
Logging来处理日志信息，所以需要commons-logging.jar的支持，请将%OSCache_Home%"lib"core"commons-logging.jar放入classpath（通常意味着将这个文件放入WEB-INF"lib目录）
<br />
如果使用JDK1.3,请将%OSCache_Home%"lib"core"commons-collections.jar放入classpath，如果使用JDK1.4或者以上版本，则不需要了
<br />
5. 将oscache.properties、oscache.tld放入WEB-INF"class目录
<br />
<br />
%OSCache_Home%"oscache.properties包含了对OSCache运行特征值的设置信息
<br />
%OSCache_Home%"oscache.tld包含了OSCache提供的标签库的定义内容 <br />
6. 修改web.xml文件
<br />
<br />
在web.xml文件中增加下面的内容，增加对OSCache提供的taglib的支持： <br />
<br />
&lt;taglib&gt;
<br />
&lt;taglib-uri&gt;oscache&lt;/taglib-uri&gt;
<br />
&lt;taglib-location&gt;/WEB-INF/classes/ oscache.tld&lt;/taglib-location&gt;
<br />
&lt;/taglib&gt; <br />
<br />
<br />
<br />
<br />
4 开始使用OSCache中的缓存组件
<br />
<br />
<br />
OSCache中按照缓存范围的不同分为两种不同的方式：一种是缓存JSP页面中部分或者全部内容，一种是基于整个页面文件的缓存。
<br />
<br />
4.1 JSP部分内容缓存 <br />
<br />
<br />
4.1.1 Cache-OSCache提供的缓存标签
<br />
<br />
<br />
这是OSCache提供的标签库中最重要的一个标签，包括在标签中的内容将应用缓存机制进行处理，处理的方式将取决于编程者对cache标签属性的设置。
<br />
<br />
第一次请求到达时，标签中的内容被处理并且缓存起来，当下一个请求到达时，缓存系统会检查这部分内容的缓存是否已经失效，主要是以下几项：
<br />
<br />
1. 缓存时间超过了cache标签设置的time或者duration属性规定的超时时间 <br />
2.
cron属性规定的时间比缓存信息的开始时间更晚 <br />
3. 标签中缓存的内容在缓存后又被重新刷新过 <br />
4. 其他缓存超期设定
<br />
如果符合上面四项中的任何一项，被缓存的内容视为已经失效，这时被缓存的内容将被重新处理并且返回处理过后的信息，如果被缓存的内容没有失效，那么返回给用户的将是缓存中的信息。
<br />
<br />
cache标签的属性说明: <br />
<br />
key -
标识缓存内容的关键词。在指定的作用范围内必须是唯一的。默认的key是被访问页面的URI和后面的请求字符串。
<br />
<br />
你可以在同一个页面中使用很多cache标签而不指定他的key属性，这种情况下系统使用该页面的URI和后面的请求字符串，另外再自动给这些key增加一个索引值来区分这些缓存内容。但是不推荐采用这样的方式。
<br />
<br />
scope - 缓存发生作用的范围，可以是application或者session <br />
<br />
time -
缓存内容的时间段，单位是秒，默认是3600秒，也就是一个小时，如果设定一个负值，那么这部分被缓存的内容将永远不过期。 <br />
<br />
duration -
指定缓存内容失效的时间，是相对time的另一个选择，可以使用简单日期格式或者符合USO-8601的日期格式。如：duration='PT5M'
duration='5s'等 <br />
<br />
refresh - false 或者true。
<br />
<br />
如果refresh属性设置为true，不管其他的属性是否符合条件，这部分被缓存的内容都将被更新，这给编程者一种选择，决定什么时候必须刷新。
<br />
<br />
mode - 如果编程者不希望被缓存的内容增加到给用户的响应中，可以设置mode属性为"silent"
<br />
<br />
其它可用的属性还包括：cron 、groups、language、refreshpolicyclass、refreshpolicyparam。
<br />
<br />
上面的这些属性可以单独使用，也可以根据需要组合使用，下面的例子将讲解这些常用属性的使用方式。 <br />
<br />
4.1.2
Cache标签实例分析: <br />
<br />
<br />
1. 最简单的cache标签用法
<br />
<br />
使用默认的关键字来标识cache内容，超时时间是默认的3600秒 <br />
<br />
&lt;cache:cache&gt; <br />
&lt;%
<br />
//自己的JSP代码内容 <br />
%&gt; <br />
&lt;/cache:cache&gt;<br />
2.
用自己指定的字符串标识缓存内容，并且设定作用范围为session。 <br />
&lt;cache:cache key="foobar"
scope="session"&gt; <br />
&lt;% <br />
//自己的JSP代码内容 <br />
%&gt;
<br />
&lt;/cache:cache&gt;
<br />
3.动态设定key值，使用自己指定的time属性设定缓存内容的超时时间，使用动态refresh值决定是否强制内容刷新。
<br />
<br />
因为OSCache使用key值来标识缓存内容，使用相同的key值将会被认为使用相同的的缓存内容，所以使用动态的key值可以自由的根据不同的角色、不同的要求决定使用不同的缓存内容。
<br />
<br />
&lt;cache:cache key="&lt;%= product.getId() %&gt;" time="1800"
refresh="&lt;%= needRefresh %&gt;"&gt; <br />
&lt;% <br />
//自己的JSP代码内容 <br />
%&gt;
<br />
&lt;/cache:cache&gt; <br />
4. 设置time属性为负数使缓存内容永不过期 <br />
&lt;cache:cache
time="-1"&gt; <br />
&lt;% <br />
//自己的JSP代码内容 <br />
%&gt; <br />
5. 使用duration属性设置超期时间
<br />
&lt;cache:cache duration='PT5M'&gt; <br />
&lt;% <br />
//自己的JSP代码内容 <br />
%&gt;
<br />
6. 使用mode属性使被缓存的内容不加入给客户的响应中 <br />
&lt;cache:cache mode='silent'&gt; <br />
&lt;%
<br />
//自己的JSP代码内容 <br />
%&gt; <br />
4.2 用CashFilter实现页面级缓存
<br />
在OSCache组件中提供了一个CacheFilter用于实现页面级的缓存，主要用于对web应用中的某些动态页面进行缓存，尤其是那些需要
生成pdf格式文件/报表、图片文件等的页面，不仅减少了数据库的交互、减少数据库服务器的压力，而且对于减少web服务器的性能消耗有很显著的效果。
<br />
<br />
这种功能的实现是通过在web.xml中进行配置来决定缓存哪一个或者一组页面，而且还可以设置缓存的相关属性，这种基于配置文件的实现方式对于J2EE来说应该是一种标准的实现方式了。
<br />
<br />
[注] 只有客户访问时返回http头信息中代码为200（也就是访问已经成功）的页面信息才能够被缓存 <br />
<br />
1. 缓存单个文件
<br />
<br />
修改web.xml，增加如下内容，确定对/testContent.jsp页面进行缓存。 <br />
<br />
&lt;filter&gt;
<br />
&lt;filter-name&gt;CacheFilter&lt;/filter-name&gt;
<br />
&lt;filter-class&gt;com.opensymphony.oscache.web.filter.CacheFilter&lt;/filter-class&gt;
<br />
&lt;/filter&gt; <br />
&lt;filter-mapping&gt;
<br />
&lt;filter-name&gt;CacheFilter&lt;/filter-name&gt;
<br />
&lt;!-对/testContent.jsp页面内容进行缓存--&gt;
<br />
&lt;url-pattern&gt;/testContent.jsp&lt;/url-pattern&gt;
<br />
&lt;/filter-mapping&gt; <br />
2. 缓存URL pattern
<br />
<br />
修改web.xml，增加如下内容，确定对*.jsp页面进行缓存。 <br />
&lt;filter&gt;
<br />
&lt;filter-name&gt;CacheFilter&lt;/filter-name&gt;
<br />
&lt;filter-class&gt;com.opensymphony.oscache.web.filter.CacheFilter&lt;/filter-class&gt;
<br />
&lt;/filter&gt; <br />
&lt;filter-mapping&gt;
<br />
&lt;filter-name&gt;CacheFilter&lt;/filter-name&gt;
<br />
&lt;!-对所有jsp页面内容进行缓存--&gt; <br />
&lt;url-pattern&gt;*.jsp&lt;/url-pattern&gt;
<br />
&lt;/filter-mapping&gt; <br />
3. 自己设定缓存属性
<br />
<br />
在页面级缓存的情况下，可以通过设置CacheFilter的初始属性来决定缓存的一些特性：time属性设置缓存的时间段，默认为
3600秒，可以根据自己的需要只有的设置，而scope属性设置，默认为application，可选项包括application、session
<br />
<br />
&lt;filter&gt; <br />
&lt;filter-name&gt;CacheFilter&lt;/filter-name&gt;
<br />
&lt;filter-class&gt;com.opensymphony.oscache.web.filter.CacheFilter&lt;/filter-class&gt;
<br />
&lt;init-param&gt; <br />
&lt;param-name&gt;time&lt;/param-name&gt;
<br />
&lt;param-value&gt;600&lt;/param-value&gt; <br />
&lt;/init-param&gt;
<br />
&lt;init-param&gt; <br />
&lt;param-name&gt;scope&lt;/param-name&gt;
<br />
&lt;param-value&gt;session&lt;/param-value&gt; <br />
&lt;/init-param&gt;
<br />
&lt;/filter&gt; <br />
&lt;filter-mapping&gt;
<br />
&lt;filter-name&gt;CacheFilter&lt;/filter-name&gt;
<br />
&lt;!-对所有jsp页面内容进行缓存--&gt; <br />
&lt;url-pattern&gt;*.jsp&lt;/url-pattern&gt;
<br />
&lt;/filter-mapping&gt; <br />
5 性能测试结果 <br />
<br />
<br />
5.1 测试环境
<br />
<br />
<br />
系统平台：windows 2000 高级服务器/ P3 800 /512M内存 <br />
<br />
web服务器：websphere 5.0
<br />
<br />
数据库服务器：mysql 4.0.18-nt <br />
<br />
性能测试用工具：apache Jmeter <br />
<br />
5.2 测试计划
<br />
<br />
<br />
这次性能测试对比方为使用缓存和不使用缓存两种，他们的访问代码都是一样的：通过数据源从本地mysql数据库中获取person表的所有记录，然后显示在页面上。
<br />
<br />
测试中将模仿10个用户，每个用户发起5次请求，然后统计所有访问花费的时间。 <br />
<br />
5.3 测试结果
<br />
<br />
<br />
使用缓存后的测试结果 不使用缓存时的测试结果 <br />
<br />
所有请求花费的总时间(毫秒) 20569 22870
<br />
<br />
性能测试的详细结果请大家查看下载内容中的《不使用cache时的系统性能测试结果.txt》和《使用cache后系统性能测试结果.txt》
<br />
<br />
6 总结
<br />
<br />
<br />
在J2EE系统中，我们经常需要处理一些特殊的动态内容，这些内容在一个时间段内的变更非常有限，但是又不得不将他们确定为动态
内容进行输出，而且非常消耗数据库系统资源或者web服务器的资源，这时我们就可以采用Cache----一种用于提高系统响应速度、改善系统运行性能的
技术----来优化我们的系统。尤其是在Web应用中，这种处理可以很显著的改善系统运行性能。 <br />
<br />
本文中作者给大家介绍一个实现J2EE框架中Web应用层缓存功能的开放源代码项目----OSCache。它提供了在J2EE系统
中实现缓存需要的丰富的功能。通过应用OSCache，我们不但可以实现通常的Cache功能、自由的设定cache的相关特性比如缓存时间段/缓存内容
等，提升系统性能，而且还能有效的改善系统的稳定性。除此之外，OSCache组件还提供了更多的特性比如集群、容错、灵活的缓存区选择等。 <br />
<br />
作者根据自己的使用经验给大家提供了一些简单的例子，他们部分演示了如何使用OSCache组件提供的丰富特性，OSCache提供的特性远不止这些，需要大家在今后的时间里深入的研究，同时也希望大家通过E-mail和作者贡献研究成果。&nbsp; <br />
<img src ="http://www.blogjava.net/gen-sky/aggbug/285811.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gen-sky/" target="_blank">星期五</a> 2009-07-07 14:43 <a href="http://www.blogjava.net/gen-sky/articles/285811.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转】OSCache简介</title><link>http://www.blogjava.net/gen-sky/articles/285801.html</link><dc:creator>星期五</dc:creator><author>星期五</author><pubDate>Tue, 07 Jul 2009 05:48:00 GMT</pubDate><guid>http://www.blogjava.net/gen-sky/articles/285801.html</guid><wfw:comment>http://www.blogjava.net/gen-sky/comments/285801.html</wfw:comment><comments>http://www.blogjava.net/gen-sky/articles/285801.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gen-sky/comments/commentRss/285801.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gen-sky/services/trackbacks/285801.html</trackback:ping><description><![CDATA[一.OSCache简介<br />
OSCache是OpenSymphony这个开源项目众多Projects中的一个。他是一个高效的J2EE缓存框架，能够很好的解决动态网站速度的问题。下面来<br />
看下OSCache解决了动态网站的哪些令人郁闷的问题。<br />
1.缓存动态内容：其实我们的动态网页上一般只有一部分是动态的（表头，表尾一般是不变的），如果我们缓存整个网页显然不成，因为有部分是<br />
随着请求有可能变的。OSCache提供的方式是允许我们只缓存一部分网页。<br />
<br />
2.缓存2进制内容：产生的图片和PDF文件在服务器加载的时候非常的耗时。OSCache解决这个问题是通过一个Servlet2.3的缓存过滤功能，然后能<br />
够缓存任意的URI（比如一个完整的页面或者是一个产生的图片/PDF文件）<br />
<br />
3.容错：有这种情况或许我们会遇到，就是当一个动态的网页出现错误。即便我们的页面有95%都加载完毕，但就是由于这个错误，整个页面就会<br />
返回错误的提示或页面。OSCache允许我们提供出现错误时的缓存内容，如果出现就适时的提示出来了。<br />
<br />
除了上面的这些Servlet的特征外，OSCache完全可以充当任何一个java程序的缓存方案。OSCache 的一般特征如下：<br />
1.缓存任意对象：可以不受限制的缓存JSP的一部分或是Http请求，任何的Java对象都可以被缓存。<br />
<br />
2.全面的API：通过API可以完完全全的控制OSCache的任何特性。<br />
<br />
3.持久缓存：我们可以把认为重要的数据缓存到硬盘上。<br />
<br />
4.支持集群：集群缓存数据能被单个的进行参数配置，不需要修改代码。<br />
<br />
5.缓存记录的过期：你可以有最大限度的控制缓存对象的过期，包括可插入式的刷新策略（如果默认性能不需要时）。<br />
<br />
二.OSCache运行环境<br />
如果用到OSCache Tag Library的话，需要Servlet2.3和JSP1.2的支持。如果是直接用OSCache API的话那么就不需要Servlet容器的支持。<br />
目前可以正常运行的Web容器：<br />
1.OrionServer(版本1.4.0和更高)<br />
2.JRun(3.0或更好)<br />
3.WebLogic(8.1或以上)<br />
4.Websphere(5.0或以上)<br />
5.Resin(1.2.3或以上)<br />
6.TomCat(4.0或以上)<br />
7.iPlanet(6.0或以上)<br />
用到缓存过滤需要Servlet2.3支持.目前知道的可以个工作在OrionServer,WebLogic,Tomcat上.<br />
OSCache需要Java的版本至少是java 1.4.<br />
<br />
三.OSCache的安装<br />
1.解压oscache-2.4.1-full<br />
2.把oscache-2.4.1.jar放到/WEB-INF/lib下.<br />
3.要确保commons-logging.jar也在环境变量中.一般情况下他也放在/WEB-INF/lib下.<br />
4.把/etc/oscache.properties放入/WEB-INF/classes下.如果用的Eclipse的话,建议新建一个Source Folder比如叫Src_Config,然后就这个OSCache的属性文件放在其中.通过修改这个OSCache的配置文件可以改变文件缓存的磁盘路径,配置持久侦听等等.<br />
5.把etc/META-INF/oscache.tld也放在/WEB-INF/classes下.<br />
<br />
四.OSCache应用学习<br />
1.JSP的应用<br />
要是想应用OSCache的标签,我们必须先要引入进来.方式有两种.<br />
其一.在web.xml中加入:<br />
&lt;taglib&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;taglib-uri&gt;oscache&lt;/taglib-uri&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;taglib-location&gt;/WEB-INF/classes/oscache.tld&lt;/taglib-location&gt;<br />
&lt;/taglib&gt;<br />
然后我们在JSp中就可以&lt;%@ taglib uri="oscache" prefix="os"%&gt;这样来引用了.<br />
其二,直接引用.直接在JSp中加入OSCache的标签库引用<br />
&lt;%@ taglib uri="/WEB-INF/classes/oscache.tld" prefix="os"%&gt;.如果要进入官方的标签库的话也行.&lt;%@ taglib uri="http://www.opensymphony.com/oscache" prefix="cache" %&gt;这样就不用再把oscache.tld放在/WEB-INF/classes下了.<br />
目前OSCache有5个标签.他们是cache, usecached, flush, addgroup, addgroups.下面我们来分别介绍一下他们的属性和用法.<br />
&lt;cache&gt;&lt;/cache&gt;<br />
他是OSCache中最主要的标签了.括起来的内容将根据属性的设置来缓存起来.第一次执行的时候,OSCache会把cache标签中的JSp执行并且缓存起来,以后再执行的话,他会首先判断缓存的内容是否过期,如果过期那么会从新执行并缓存.否则就直接从缓存中读取.判定过期的条件如下:<br />
i.缓存的内容超过了属性time所指定的时间.<br />
ii.不符合cron设置的时间间隔.<br />
iii.如果scope指定的范围刷新的话,则认为过期了.如Session过期.<br />
属性如下:<br />
key&nbsp;&nbsp;&nbsp; : 缓存的Key,可以是任何的字符,用来寻找缓存的内容用的.可以理解成HashMap中的Key.不能把2个要缓存的东东定义成一个名字,那样后一个会覆盖前一个的内容.默认情况,如果不指定Key的话,OSCache也会自动生成一个Key,规则是请求的URI+当前页面的Query String.<br />
scope&nbsp;&nbsp; : 缓存的范围.有2个, application和session.默认值是application.<br />
time&nbsp;&nbsp;&nbsp; : 缓存内容的时间.以秒为单位,默认是3600秒.到了指定的时间,就会刷新缓存内容.如果指定一个负数的话,意味着永远不会过期.<br />
duration : 也是用来指定缓存内容的时间,它和time属性只能是2选1,它的特点是可以用Simple Data Format 或者是ISO-8601进行日期格式化.<br />
cron&nbsp;&nbsp;&nbsp; : 用万年历的形式指定缓存内容何时过期的.它应用的Unix的万年历形式,如("0 * * * *")<br />
refresh&nbsp;&nbsp; : 是个Boolean值,如果是True的话,则不管前面提到的过期检查,都刷新.默认情况是false.<br />
mode&nbsp;&nbsp;&nbsp; : 设置这项为&#8221;silent&#8221;将防止把括起来的内容输出.这在你预加载缓存内容而不愿显示给用户看到时很有用.<br />
groups&nbsp;&nbsp; : 可以提供一个以逗号分割的组名称.如group="A, B".这将允许你以组的名义来操作他们,分组非常有用,比如你要缓存的内容正好需要另外一个应用程序的一部分或数据,当依赖的发生了改变,正好联动的可以使很多的组过期,进而使与组发生关联的缓存内容得到更新.<br />
language : 设置编码方式.<br />
refreshpolicyclass:指定自定义的类来处理缓存的内容什么时候过期.这个类需要从 refreshpolicyparam com.opensymphony.oscache.web.WebEntryRefreshPolicy继承.<br />
refreshpolicyparam : 它和上面的是联合使用的.是给refreshpolicyclass传任意的参数的.指定这项的话,就必须有refreshpolicyclass,否则就不起作用.<br />
属性就这么多了,下面举几个应用的例子:<br />
&lt;os:cache key="&lt;%=myKey%&gt;" time="1800" refresh="&lt;%=needRefresh%&gt;"&gt;<br />
&lt;!--这里是要缓存的内容--&gt;<br />
&lt;/os:cache&gt;<br />
这里将myKey标识的缓存内容保持30分钟,到期自动刷新.如果needRefresh为true也会刷新(适合于更新内容的即时刷新).<br />
<br />
&lt;os:cache key="&lt;%=myKey%&gt;" cron="0 2 * * *" refresh="&lt;%=needRefresh%&gt;"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;!--这里是要缓存的内容--&gt;<br />
&lt;/os:cache&gt;<br />
将myKey标识的缓存内容在每天的凌晨2时自动刷新.如果needRefresh为true也会刷新(适合于更新内容的即时刷新).<br />
举到了这个例子,我不得不把cron表达式多说几句.首先这五颗星的位置代表<br />
分,小时,一个月中的天,月,一周中的天<br />
分: 无疑问0~59.<br />
小时 : 无疑问 0~23.<br />
天(月) : 1~31<br />
月 : 1~12,用英文全称也可以.如January, April<br />
天(周): 0~6(0代表Sunday; 1代表Monday&#8230; 6代表Saturday)<br />
举个例子,比如我们想让缓存的内容在4月的晚上11:45分过期.我们可以这样来写<br />
"45 23 * April *".<br />
<br />
<br />
&lt;usecached /&gt;<br />
需要放在cache标签中嵌套使用(一般配合try..catch使用)告诉他的上级标签是否应用缓存的译本. 则出现异常时将会替换包括上级标签在内的所有内容(提示:Missing cached content). use="true|false" : 是否应用的标记. 默认为True.一般省略.<br />
应用例子:<br />
&lt;os:cache&gt;<br />
&nbsp;&nbsp; ..内容..<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;% try {%&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ......其它内容<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;%}catch (Exception e) {%&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Inside catch: &lt;os:usecached use="&lt;%=isUsed%&gt;"/&gt; YES<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;% } %&gt;<br />
&nbsp;&nbsp; &lt;/os:cache&gt;<br />
则出现异常时的页面输出有两种:<br />
1&gt;. isUsed=false<br />
..内容..<br />
......其它内容<br />
Inside catch: YES<br />
2&gt;. isUsed=true<br />
Missing cached content<br />
<br />
&lt;flush /&gt;<br />
这个标签是用于在运行时状态下刷新缓存的.这个标签非常有用,因为它可以放在Web程序的管理部分使管理员可以决定何时刷新缓存.<br />
属性如下:<br />
scope : 刷新的范围.3个值, "application", "session" and null .null表示刷新所有.<br />
Key&nbsp;&nbsp; : 和scope联合使用,刷新指定范围的指定缓存.如果不指定scope则key无效.<br />
group&nbsp;&nbsp; : 和scope联合使用, 刷新指定范围的指定组中的缓存. 不指定scope无效.<br />
Pattern :任何包含了pattren指定的字符串的缓存都被更新.它也是和scope连用.但是现在官方不赞成再用这个属性了.用group完全可以取代这个.便于管理.<br />
language : 设置编码方式<br />
举几个应用的例子:<br />
&nbsp;&nbsp;&nbsp;&nbsp; 刷新整个application.<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;os:flush scope="application" /&gt;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp; 刷新session中的foobar这个缓存.<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;os:flush scope="session" key="foobar" /&gt;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp; 在application 中刷新所有currencyData 组中的缓存<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;os:flush scope="application" group="currencyData" /&gt;<br />
<br />
<br />
&lt;addgroup /&gt;<br />
这个标签也是必须嵌套在cache标签中的.把缓存的东东放入到指定的组中.这样就可以以组来刷新指定的内容了.<br />
属性只有group来指定名字的.例子如下:<br />
&nbsp;&nbsp;&nbsp;&nbsp; 把test1加入到group1和group2中<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;os:cache key="test1"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; os:addgroup group="group1" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ... some jsp content ...<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; os:addgroup group="group2" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ... some more jsp content ...<br />
&lt;/ os:cache&gt;<br />
<br />
<br />
&lt;addgroups /&gt; (2.3及以后的版本中新加的)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 同上面的功能相同,只不过可以不用一个一个加group了.例子如下:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; os:cache key="test1"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ... some jsp content ...<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; os:addgroups groups="group1,group2" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ... some jsp content ...<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/ os:cache&gt;<br />
<br />
2.API的应用<br />
在实际应用中除了JSP标签库和CacheFilter(下面介绍)外,还可以使用OSCache提供的Java API .下面我来介绍一个实用的Java类 ,使用GeneralCacheAdministrator来建立,刷新和管理缓存. GeneralCacheAdministrator可以被实例化,里面有很多的实用方法.此外它还管理加载cache.properties并且根据这个属性文件创建一个缓存实例.因此你最好使用单例模式来创建GeneralCacheAdministrator实例.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 主要用到的GeneralCacheAdministrator的方法有<br />
public Object getFromCache(String key) throws NeedsRefreshException; -- 从缓存中获取一个key标识的对象.<br />
public Object getFromCache(String key, int refreshPeriod) throws NeedsRefreshException ; -- 从缓存中获取一个key标识的对象.&nbsp;&nbsp; refreshPeriod刷新周期,标识此对象在缓存中保存的时间(单位:秒)<br />
<br />
public void putInCache(String key, Object content)&nbsp;&nbsp; -- 存储一个由Key标识的缓存对象.<br />
<br />
public void putInCache(String key, Object content, String[] groups)&nbsp;&nbsp;&nbsp; -- 存储一个由Key标识的属于groups中所有成员的缓存对象.<br />
<br />
public void flushEntry(String key) -- 更新一个Key标识的缓存对象.<br />
public void flushGroup(String group) --更新一组属于groupr标识的所有缓存对象.<br />
public void flushAll() -- 更新所有缓存.<br />
<br />
public void cancelUpdate(String key) --- 取消更新 只用于在处理捕获的NeedsRefreshException异常并尝试生成新缓存内容失效的时候.<br />
public void removeEntry(String key) ---从缓中移除一个key标识的对象<br />
public void clear()&nbsp;&nbsp; --- 清除所有缓存<br />
<br />
官方的使用例子:<br />
///采取补救措施的典型方案<br />
String myKey = "myKey";<br />
String myValue;<br />
int myRefreshPeriod = 1000; //刷新周期1000秒<br />
try {<br />
&nbsp;&nbsp;&nbsp;&nbsp; //从Cache中获得 要做类型转换<br />
&nbsp;&nbsp;&nbsp;&nbsp; myValue = (String) admin.getFromCache(myKey, myRefreshPeriod);<br />
} catch (NeedsRefreshException nre) {<br />
&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Cache中没有则从库获得数据.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myValue = "This is the content retrieved.";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 存放在Cache中 键值myKey<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; admin.putInCache(myKey, myValue);<br />
&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception ex) {<br />
// 尝试恢复Cache中的内容<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myValue = (String) nre.getCacheContent();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 如果Cache中的内容没有复原 则用这个终级方法<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; admin.cancelUpdate(myKey);&nbsp;&nbsp; //取消对myKey的更新 即类似数据回滚<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
}<br />
///不采取补救措施的典型方案<br />
String myKey = "myKey";<br />
String myValue;<br />
int myRefreshPeriod = 1000;<br />
try {<br />
&nbsp;&nbsp;&nbsp;&nbsp; //从Cache中获得 要做类型转换<br />
&nbsp;&nbsp;&nbsp;&nbsp; myValue = (String) admin.getFromCache(myKey, myRefreshPeriod);<br />
} catch (NeedsRefreshException nre) {<br />
&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Cache中没有则从库获得数据.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myValue = "This is the content retrieved.";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 存放在Cache中 键值myKey<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; admin.putInCache(myKey, myValue);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; updated = true;<br />
&nbsp;&nbsp;&nbsp;&nbsp; } finally {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!updated) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 如果Cache中的内容更新出现异常 则用这个终级方法<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; admin.cancelUpdate(myKey);&nbsp;&nbsp; //取消对myKey的更新 即类似数据回滚<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
}<br />
注意:<br />
如果一个NeedsRefreshException出现 必须调用admin.putInCache或甚至admin.cancelUpdate来避免死锁情况发生.<br />
<br />
3.CacheFilter的应用<br />
OScache可以是你很轻易的缓存网站中全部页面,甚至是那些二进制文件.从2.4版本开始你可以在运行期设置和覆盖CacheFilter的初始化参数.注意,只有返回状态为200的页面才会缓存. (HttpServletResponse.SC_OK).<br />
配置CacheFilter,在Web.xml中加入如下:<br />
&lt;filter&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-name&gt;CacheFilter&lt;/filter-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-class&gt;com.opensymphony.oscache.web.filter.CacheFilter&lt;/filter-class&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;init-param&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;time&lt;/param-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;600&lt;/param-value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/init-param&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;init-param&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;scope&lt;/param-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;session&lt;/param-value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/init-param&gt;<br />
&lt;/filter&gt;<br />
<br />
&lt;filter-mapping&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-name&gt;CacheFilter&lt;/filter-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;*.jsp&lt;/url-pattern&gt;<br />
&lt;/filter-mapping&gt;<br />
这个例子将在session范围缓存所有JSp10分钟.默认情况scope为application,时间为1小时.<br />
如果ICacheKeyProvider不设置的话,这个CacheFilter将使用(URI+QueryString)作为缓存Key.<br />
你可以使用下列的初始化参数来设置CacheFilter:<br />
<br />
Parameter: time<br />
设置缓存时间,默认是1个小时.可以设置为-1(不确定).这样他就不会过期了.除非你明确刷新它(前面说到的refresh =&#8221;true&#8221;).或者是更改这个刷新的策略.<br />
<br />
Parameter: scope<br />
同cache的scope. 也是有application(default)和session<br />
<br />
Parameter: cron (NEW! Since 2.3)<br />
同cache的scope.设置过期<br />
<br />
Parameter: fragment (NEW! Since 2.2)<br />
作用不太清除,用默认即可.<br />
<br />
Parameter: nocache (NEW! Since 2.2)<br />
定义那些页面不需要缓存.&#8221;off&#8221;---缓存所有;&#8221;sessionIdInURL&#8221;---如果session中包括这URL的则不缓存这个页面<br />
<br />
Parameter: lastModified (NEW! Since 2.2)<br />
定义是否把Header发送到Response中.<br />
"off"----不发送,即便它设置在过滤链中.<br />
"on"----如果在过滤链中则发送.<br />
"inital"(default)----最后更改的信息将基于当前时间被设置<br />
<br />
Parameter: max-age (NEW! Since 2.3.1)<br />
设置在浏览器中缓存的最大时间.在设置的期间,不再向服务器请求,而是从自己的缓存中查找页面.默认是60秒.<br />
<br />
Parameter: expires (NEW! Since 2.2)<br />
定义过期header发送到Response中的时间.<br />
"off"----不发送.<br />
"on"(default)---如果在过滤链中则发送.并且time这个过期信息将基于时间参数和页面内容的创建时间初始化.<br />
<br />
Parameter: ICacheKeyProvider (NEW! Since 2.2)<br />
指定实现ICacheKeyProvider接口的类.<br />
<br />
Parameter: ICacheGroupsProvider (NEW! Since 2.2)<br />
指定实现ICacheGroupsProvider接口的类<br />
<br />
Parameter: EntryRefreshPolicy (New! Since 2.3)<br />
指定实现EntryRefreshPolicy接口的类.<br />
<br />
Parameter: disableCacheOnMethods (New! Since 2.4)<br />
指定请求方式不进行缓存.默认Null,对所有的请求方式都缓存.例如:<br />
&lt;init-param&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;disableCacheOnMethods&lt;/param-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;POST,PUT,DELETE&lt;/param-value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/init-param&gt;<br />
<br />
Parameter: oscache-properties-file (New! Since 2.4)<br />
通过指定OSCache的属性文件,开发者就能运行多个CacheFilter<br />
<br />
4.OSCache的属性文件.(oscache.properties)<br />
cache.memory<br />
值为true或false.默认为true.如果设置为false那么缓存到数据库或硬盘中.似乎有点傻,所以我们一般不改此项.<br />
<br />
cache.capacity<br />
缓存元素的个数.默认是没有限制的.<br />
<br />
cache.algorithm<br />
缓存的算法.注意要是指定算法的话,必须把上面的缓存个数指定.这里支持三种算法.<br />
com.opensymphony.oscache.base.algorithm.LRUCache &#8211; 最后最近使用<br />
com.opensymphony.oscache.base.algorithm.FIFOCache &#8211; 先进先出<br />
com.opensymphony.oscache.base.algorithm.UnlimitedCache &#8211; 无限缓存<br />
<br />
cache.blocking<br />
是否同步化。true 或者 false。一般设为true，避免读取脏数据。<br />
<br />
cache.unlimited.disk<br />
指定硬盘缓存是否要作限制。默认值为false。false的状况下，disk cache capacity 将和cache.capacity的值相同。<br />
<br />
cache.persistence.class<br />
指定类是被持久化的类。class必须实现PersistenceListener接口。作为硬盘持久，可以实现 com.opensymphony.oscache.plugins.diskpersistence.HashDiskPersistenceListener 接口。它把class的toString()输出的hash值作为文件的名称。如果你要把文件名易读（自己设定），DiskPersistenceListener 的父类也 能使用，但其可能有非法字符或者过长的名字。注意：HashDiskPersistenceListener 和 DiskPersistenceListener 需要设定硬盘路径：cache.path<br />
<br />
cache.path<br />
指定硬盘缓存的路径。目录如果不存在将被建立。同时注意oscache应该要有权限写文件系统。 cache.path=c:""myapp""cache or *ix: cache.path=/opt/myapp/cache<br />
<br />
cache.persistence.overflow.only (NEW! Since 2.1)<br />
指定是否只有在内存不足的情况下才使用硬盘缓存。 默认值false。但推荐是true如果内存cache被允许的话。这个属性彻底的改变了cache的行为，使得persisted cache 和memory完全不同。<br />
<br />
cache.event.listeners<br />
用逗号分离的class名列表。每个class必须实现以下接口之一，或者几个 CacheEntryEventListener：接收cache add/update/flush and remove事件 CacheMapAccessEventListener ：接收cache访问事件。这个可以让你跟踪cache怎么工作。 默认是不配置任何class的。当然你可以使用一下的class： com.opensymphony.oscache.plugins.clustersupport.BroadcastingCacheEventListener －分布式的(此处被屏蔽)。可以广播到局域网内的其他cache实例。 com.opensymphony.oscache.extra.CacheEntryEventListenerImpl －一个简单的(此处被屏蔽)。在cache的生命周期中记录count of 所有entry的事件。 com.opensymphony.oscache.extra.CacheMapAccessEventListenerImpl －记录count of cache map events（cache hits，misses and state hits）.<br />
<br />
cache.key<br />
设置ServletCacheAdministrator使用的Key.在代码中如果需要用到的话,可以通过com.opensymphony.oscache.web.ServletCacheAdministrator.DEFAULT_CACHE_KEY得到.<br />
<br />
cache.use.host.domain.in.key<br />
如果你的服务器是被配置到多台主机上的话,你或许想加上一个主机的名字在它生成的缓存Key上.true的话会加上.默认值是false.<br />
<br />
附加的属性: cache.cluster.multicast.ip,&nbsp;&nbsp; cache.cluster.properties<br />
<br />
5.小结:<br />
OSCache的使用主要有4种：<br />
POJO 缓存<br />
HTTP Response 缓存<br />
JSP Tag Library 缓存<br />
O/R Data Access 缓存<br />
<br />
1)、POJO 缓存<br />
这种方式的缓存直接调用OSCache的API进行，主要用于处理页面内容会根据参数动态改变，可以将参数设置为key值来保存数据：<br />
首先，声明成员变量：<br />
// OSCache Adminitrator instance<br />
private static GeneralCacheAdministrator cacheAdmin = null;<br />
其次，进行初始化：<br />
public RingArtistAction() {<br />
&nbsp;&nbsp; cacheAdmin = new GeneralCacheAdministrator();<br />
}<br />
将POJO进行缓存：<br />
&nbsp;&nbsp; // Cache data key and refresh period<br />
&nbsp;&nbsp; String key = sex + ":" + place;<br />
&nbsp;&nbsp; int refreshPeriod = Constants.getIntegerValue(Constants.OSCACHE_REFRESH_PERIOD).intValue();<br />
&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Get from the cache<br />
&nbsp;&nbsp;&nbsp; artists = (Map) cacheAdmin.getFromCache(key, refreshPeriod);<br />
&nbsp;&nbsp; } catch (NeedsRefreshException nre) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Get the value (probably from the database)<br />
&nbsp;&nbsp;&nbsp;&nbsp; int count = getArtistCount(sex, place, errors);<br />
&nbsp;&nbsp;&nbsp;&nbsp; artists = getArtistData(sex, place, count, errors);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Store in the cache<br />
&nbsp;&nbsp;&nbsp;&nbsp; cacheAdmin.putInCache(key, artists);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception ex) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // We have the current content if we want fail-over.<br />
&nbsp;&nbsp;&nbsp;&nbsp; artists = (Map) nre.getCacheContent();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // It is essential that cancelUpdate is called if the<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // cached content is not rebuilt<br />
&nbsp;&nbsp;&nbsp;&nbsp; cacheAdmin.cancelUpdate(key);<br />
&nbsp;&nbsp;&nbsp;&nbsp; ex.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; }<br />
&nbsp; <br />
2)、HTTP Response 缓存<br />
这种方式的缓存用来处理整个页面的内容固定，不会根据参数动态改变：<br />
首先在web.xml中配置CacheFilter：<br />
&lt;filter&gt;<br />
&nbsp;&nbsp; &lt;filter-name&gt;CacheFilter&lt;/filter-name&gt;<br />
&nbsp;&nbsp; &lt;filter-class&gt;com.opensymphony.oscache.web.filter.CacheFilter&lt;/filter-class&gt;<br />
&nbsp;&nbsp; &lt;init-param&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;param-name&gt;time&lt;/param-name&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;param-value&gt;86400&lt;/param-value&gt;<br />
&nbsp;&nbsp; &lt;/init-param&gt;<br />
&nbsp;&nbsp; &lt;init-param&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;param-name&gt;scope&lt;/param-name&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;param-value&gt;application&lt;/param-value&gt;<br />
&nbsp;&nbsp; &lt;/init-param&gt;<br />
&lt;/filter&gt;<br />
将所有需要缓存的页面加入filter-mapping：<br />
&lt;filter-mapping&gt;<br />
&nbsp;&nbsp; &lt;filter-name&gt;Set Character Encoding&lt;/filter-name&gt;<br />
&nbsp;&nbsp; &lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br />
&lt;/filter-mapping&gt;<br />
注意，只有返回状态为200（HttpServletResponse.SC_OK）的内容才会被缓存<br />
<br />
3)、JSP Tag 缓存<br />
JSP Tag缓存主要用于缓存JSP页面的局部内容：<br />
&nbsp;&nbsp; &lt;cache:cache key="especialcategory" cron="* 5 * * *"&gt;<br />
&nbsp;&nbsp; &lt;jsp:include page="/ringcategory.do" flush="true" &gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;jsp:param name="ringType" value="1"/&gt;<br />
&nbsp;&nbsp; &lt;/jsp:include&gt;<br />
&nbsp;&nbsp; &lt;/cache:cache&gt;<br />
<br />
4)、O/R Data Access 缓存<br />
请阅读参考资料的内容获取详情.<br />
<br />
<img src ="http://www.blogjava.net/gen-sky/aggbug/285801.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gen-sky/" target="_blank">星期五</a> 2009-07-07 13:48 <a href="http://www.blogjava.net/gen-sky/articles/285801.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>