??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲av成人一区二区三区在线播放
,亚洲国产精品久久66,亚洲中文字幕无码爆乳app http://www.tkk7.com/gen-sky/category/40687.htmll日昏昏醉梦_忽闻春尽强登山, 因过竚w逢僧话,偷得生半日闌Ӏ?/description>zh-cn Wed, 08 Jul 2009 06:39:27 GMT Wed, 08 Jul 2009 06:39:27 GMT 60 [转] osCache内部介绍 http://www.tkk7.com/gen-sky/articles/285823.html星期?/dc:creator>星期?/author>Tue, 07 Jul 2009 07:22:00 GMT http://www.tkk7.com/gen-sky/articles/285823.html http://www.tkk7.com/gen-sky/comments/285823.html http://www.tkk7.com/gen-sky/articles/285823.html#Feedback 0 http://www.tkk7.com/gen-sky/comments/commentRss/285823.html http://www.tkk7.com/gen-sky/services/trackbacks/285823.html 转自Qhttp://blog.csdn.net/furthersun/archive/2008/09/19/2952329.aspx
1、摘?
本文档介l了如何?Portlet 应用中?OSCache q行面内容~存和对象缓存,分析?OSCache
的实现原理,q提Z一个用来缓存对象和面的简单易用的Ҏ。本文档不涉?OSCache 的安装与配置的内容,相关内容请参?OSCache
?在线文档 ?
2?OSCache ?
OSCache标记库由OpenSymphony设计Q它是一U开创性的~存ҎQ它提供了在现有JSP面之内实现内存~存的功能。OSCache是个一个被q泛采用的高性能的J2EE~存框架QOSCacheq能应用于Q何Java应用E序的普通的~存解决Ҏ?
OSCache有以下特点:
l ~存M对象Q你可以不受限制的缓存部分jsp面或HTTPhQQ何java对象都可以缓存?
l 拥有全面的APIQOSCache API允许你通过~程的方式来控制所有的OSCacheҎ?
l 怹~存Q缓存能被配|写入硬盘,因此允许在应用服务器的多ơ生命周期间~存创徏开销昂贵的数据?
l 支持集群Q集缓存数据能被单个的q行参数配置Q不需要修改代码?
l ~存q期Q你可以有最大限度的控制~存对象的过期,包括可插入式的刷新策略(如果默认性能不能满需要时Q?
3、OSCache ~存原理?nbsp;
Cache Factory
Cache Proxy
Cache Map
Memory
Disk
Listeners
Cache Entry
?3-1 OSCache 架构概览
Cache Factory Q该实体负责获得 Cache Proxy Q兼有一些对 Cache Proxy 的管理功能。对应到现在?
OSCache 实现中的cLQ?GeneralCacheAdministrator ?ServletCacheAdministrator ?
Cache Proxy Q该实体?Cache Map 的代理,它主要负责从 Cache Map 中取?/
存储指定的缓存对象,如果~存对象q期Q那么就缓存刷斎ͼq向指定的监听者发送存 / 取事件。对应到现在?OSCache 实现中的cLQ?
Cache ?ServletCache ?
Cache Map Q该实体存储了所有的~存实体Q是一?OSCache 专有?Map
实现Q它能根据指定的法清除~存Q以及将~存持久化到盘中。对应到现在?OSCache 实现中的cLQ?FIFOCache Q?
LRUCache ?UnlimitedCache ?
Listeners Q?OSCache ?/ 取事件的监听者实体。对应到现在?OSCache 实现中的cLQ?CacheEntryEventListener ?CacheMapAccessEventListener ?
Cache Entry Q表C缓存对象的包装实体Q它包装了缓存对象和h{略。对应到现在?OSCache 实现中的cLQ?CacheEntry ?
3.1 应用场景
一个典型的“~存对象”场景是:
应用调用 Cache Factory 获得 Cache Proxy Q然后应用将要缓存的对象以及h{略通过 Cache Proxy 存储?Cache Map 中,q知各个 Listener ?
一个典型的“取得~存对象”的场景是Q?
应用调用 Cache Factory 获得 Cache Proxy Q然后给 Cache Proxy 的相应方法传入要获得的缓存对象的
key Q?Cache Proxy
会根据指定的h{略判断~存是否q期Q如果缓存没有过期,则返回缓存对象,如果~存q期Q则h~存Qƈ向应用层抛出需要刷新的异常Q?
NeedsRefreshException Q,应用如果收到此异常,重新计内容ƈ内容缓存?
4、Web 应用中的~存Ҏ
4.1 假定
OSCache 现有的缓存刷新策略(过指定旉后自动过期,过指定日期后自动过期,按照克龙表达式的讑֮自动q期Q不能满需求。现有应用要求:当数据源的部分内Ҏ新后Q能够相关~存q期Q展现页面从数据源取得更新的内容昄?
4.2、方案应用场?
该方案ؓ下列场景提供了支持:
1Q?~存整个 Response Q能够定制刷新指定的 Response ?
2Q?~存 JSP 面内容Q能够定制刷新指定的~存内容?
3Q?~存对象Q能够定制刷新指定的~存对象?
4.3?配置
4.3.1 配置 ***CacheFilter
?Web 应用?web.xml 中添加下面的内容Q?
< filter>
< filter-name>CacheFilter</filter-name>
< filter-class>
com.***.portal.oscache.***CacheFilter
</ filter-class>
< init-param>
< param-name>time</param-name>
< param-value>-1</param-value>
</ init-param>
< init-param>
< param-name>scope</param-name>
定制q个 fileter ~存?response 的组
< param-value>application</param-value>
</ init-param>
<init-param>
<param-name>groups</param-name>
<param-value> landy </param-value>
</init-param>
</ filter>
< filter-mapping>
< filter-name>CacheFilter</filter-name>
< url-pattern>/ landy </ url-pattern>
</ filter-mapping>
注意Q?
Z在部分数据更新时只刷新部?Response Q?***CacheFilter ?OSCache 提供?CacheFitler
增加了一个可配置的参敎ͼ“ groups ”Q部|者可以通过q个参数配置q个 filter 所映射?URLS 的组Q通常同一个组?URL
会从同时更新的数据源取数据)Q这样当数据源某部分更新之后Q我们就可以h从这部分数据源取数据?URLs
。该配置Ҏ持配|多个组Q以逗号作ؓ分隔W,如:“ group1,group2 ”?
其他的配|项说明请参?OSCache 在线文档?CacheFilter 配置部分 ?
4.4、缓存整?Response
OSCache 提供?CacheFilter 能够~存 Response Q但不能供应用选择性的h某些 Response Q?***CacheFilter p支持q一Ҏ?
4.4.1 使用Ҏ
您可以按照以下的方式h某一l( Filter 初始化参C groups 参数配置的内容)?Responses:
ServletCacheAdministrator admin = null;
Filter 初始化参C scope 参数配置的内?nbsp;
admin = ServletCacheAdministrator.getInstance(config
.getServletContext());
Filter 初始化参C groups 参数配置的内?
Cache cache = admin.getCache(httpRequest, cacheScope);
cache. flushGroup(group);
4.4.2 U束
q种Ҏ仅适用于普通的 web 应用Q不适用?Portlets 应用Q因为在 Portlets
应用中,每个 Portlet 都是面上一个可插拔的组Ӟ如果被缓存的 Response 代表的页面中某个 Portlet
被删除了Q那么这个页面生的 Response ׃不一P而这时应用却无法h~存?Response ?
4.5?~存 JSP 面内容
可以?JSP 面中将要缓存的内容|于 <cache></cache> 标签之间Q当更新数据源的事g产生Ӟ在处理事件的Ҏ中加入如下代码即可:
***OSCacheUtil.getInstance().flushGroup("group1");
4.5.1 样例
我要~存一个从数据源的 A 表取数据?JSP 内容D,如下表所C:
<oscache:cache key="foobar" scope="application" time="-1" groups="group1" >
//business code
Select * from table A and Display
</oscache:cache>
数据源更CQ在处理数据更新事g的代码中Q我加入下表的代码:
***OSCacheUtil.getInstance().flushGroup("group1");
q样可以刷新缓存的 group1 l的数据了?
4.5.2 U束
本方案在满?4.1 描述的需求的条g下,仅支持选择性的h存储?application 域(
cache 标签?scope 属性配|ؓ application Q的~存。ؓ什么不支持选择性的h session
域的~存呢?是因为数据更新的事g产生是随机的Q当数据更新事g发生Ӟ我们无法得到 web 服务器中的每?session
Q所以不能支持选择性的h session 域的~存?
4.6、缓存对?
可以?web 应用的业务处理逻辑中将要缓存的对象采用如下的方式将对象~存?application 域中Q?
***OSCacheUtil.getInstance().putInCache(key, content, new String[]{“group1”});
当更新数据源的事件生时Q在处理事g的方法中加入如下代码卛_Q?
***OSCacheUtil.getInstance().flushGroup("group1");
4.6.1 U束
?4.5.2 一致?
5、Demo
5.1 Ҏ框架
包括 ***CacheFilter ?***OSCacheUtil ?
5.2 试用例Q基?portlet Q?
用例 src Q?
用例 ear Q?
]]>(?在Spring框架中用OSCache~存 http://www.tkk7.com/gen-sky/articles/285816.html星期?/dc:creator>星期?/author>Tue, 07 Jul 2009 06:51:00 GMT http://www.tkk7.com/gen-sky/articles/285816.html http://www.tkk7.com/gen-sky/comments/285816.html http://www.tkk7.com/gen-sky/articles/285816.html#Feedback 0 http://www.tkk7.com/gen-sky/comments/commentRss/285816.html http://www.tkk7.com/gen-sky/services/trackbacks/285816.html
?/span>Spring 框架中?/span>OSCache ~存
是使用 Spring 提供?/span>springmodules ?/span>OSCache 来简化程序的开发,通过配置文g来完成提供缓存。参?/span>springmodules 的文档?/span>
1 、创?/span>Spring OSCache 的配|?/span>xml 文g
2 ?span style="color: #626262;">?/span> oscache.properties ?/span>oscache.tld 攑օ WEB-INF"class 目录Q?/span>q修改属性文件的参数
下边 Spring OSCache 配置信息来自 http://www.javaeye.com/problems/7493
<? xml version = "1.0" encoding = "UTF-8" ?>
<! DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd" >
< beans >
< bean id = "cacheManager"
class = "org.springmodules.cache.provider.oscache.OsCacheManagerFactoryBean" >
<!-- Optional properties -->
< property name = "configLocation" value = "classpath:oscache_config.properties" />
</ bean >
< bean id = "cacheProviderFacade"
class = "org.springmodules.cache.provider.oscache.OsCacheFacade" >
< property name = "cacheManager" ref = "cacheManager" />
</ bean >
< bean id = "cacheKeyGenerator" class = "org.springmodules.cache.key.HashCodeCacheKeyGenerator" />
< bean id = "userDaoProxy"
class = "org.springmodules.cache.interceptor.proxy.CacheProxyFactoryBean" >
< property name = "cacheProviderFacade" ref = "cacheProviderFacade" />
< property name = "cacheKeyGenerator" ref = "cacheKeyGenerator" />
< property name = "cachingModels" >
< props >
< prop key = "get*" > refreshPeriod=12;groups=user </ prop >
</ props >
</ property >
< property name = "flushingModels" >
< props >
< prop key = "update*" > groups=user </ prop >
< prop key = "delete*" > groups=user </ prop >
< prop key = "add*" > groups=user </ prop >
</ props >
</ property >
< property name = "cachingListeners" >
< list >
<!--ref bean="cachingListener" /-->
</ list >
</ property >
< property name = "target" ref = "userDaoTarget" />
</ bean >
< bean id = "userDaoTarget" class = "com.logictown.BHT.dao.springJdbc.UserDaoImpl" >
< property name = "dataSource" ref = "dataSource" />
</ bean >
</ beans >
]]> [转]应用OSCache提升J2EEpȝq行性能 http://www.tkk7.com/gen-sky/articles/285811.html星期?/dc:creator>星期?/author>Tue, 07 Jul 2009 06:43:00 GMT http://www.tkk7.com/gen-sky/articles/285811.html http://www.tkk7.com/gen-sky/comments/285811.html http://www.tkk7.com/gen-sky/articles/285811.html#Feedback 0 http://www.tkk7.com/gen-sky/comments/commentRss/285811.html http://www.tkk7.com/gen-sky/services/trackbacks/285811.html
1.1
需要处理的Ҏ动态内?
在信息系l徏设过E中我们通常会遇到这L问题Q?
1. 基础数据的变更问?
信息pȝ中需要处理的基础数据的内容短旉内是不会发生变化的,但是在一个相寚w一些的旉里,它却可能是动态增加或者减的?
举个例子Q电子商务中关于送货区域的定义,可能短时间内不会发生变化Q但是随着电子商务企业业务的扩大,pȝ中需要处理的送货区域可?
增加。所以我们的pȝ中不得不在每ơ向客户展示送货区域信息的时候都和数据库Q假N货区域信息保存在数据库中,q也是通常采用的处理方法)q行交互?
2. l计报表Q不仅限于统计报表)的问?
一般来_l计报表是一个周期性的工作Q可能是半个月、一个月或者更长的旉才会需要更Cơ,然而统计报表通常是图形显C或者是生成pdf、word、excel{格式的文gQ这些图形内宏V文件的生成通常需要消耗很多的pȝ资源Q给pȝq行造成很大的负担?
1.2 问题的共同点
通过比较分析Q不隑֏现这两类问题有一些共同点Q?
1、被处理的内容短旉不变Q所以短旉内可以作为静态内容进行处?
2、在一个不太长的时间内Q被处理的内容可能或者必定生变化,所以必d他们作ؓ动态内容进行处?
3、在合理的时间区D内可以忽略被处理内容变化后带来的媄?
4、对q些内容的处理动作比较消耗系l性能Q媄响系l响应时?
1.3 解决Ҏ
~存技术可以帮助我们很好的解决q个问题Q?
1、缓存信?
当上q的基础数据或者统计报表第一ơ被讉KӞ被处理的内容被当作动态信息,基础数库从数据库中获得,l计报表也会被生成符合要求的囑Ş、文Ӟ然后q些信息都会被放入缓存信息中?
2、响应信息由~存提供
当上q的基础数据或者统计报表l被讉KӞpȝ会首先查缓存信息中是否有对应的内容和我们设定的~存规则Q如果符合缓存信息存在而且W合~存规则Q给出的响应来自于~存信息Q如果没有或者缓存信息已l不W合讑֮的要求,pȝ重复上一步的动作?
很显Ӟ上面的步?中,多数情况下,当用戯求到达时Q被处理的内容将来自于缓存,所以大大的减少了与数据库的交互Q或者不再需要ؓ每个h都生成一ơ报表图形或者文Ӟq部分工作的减少对于降低pȝ性能消耗、提高系l稳定性和q发处理能力是非常有益的?
2 OSCache?
OSCache是OpenSymphonyl织提供的一个J2EE架构中Web应用层的~存技术实现组Ӟ它的出现解决了我们面临的问题?
OSCache目前最新的E_版本?.0Q本文中的例子都是基于这个版本的Q如果大家运行例子的q程中发生问题,请首先确认是否采用了正确的Y件版本?
2.1 主要特征
1. 兼容多种支持JSP的web服务?
已经通过兼容试的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或者以上版?
Q其他支持servlet2.3、jsp1.2的web服务器应该都是完全兼容OSCache的?
2. 可选的~存?
你可以用内存、硬盘空间、同时用内存和盘或者提供自q其他资源Q需要自己提供适配器)作ؓ~存区?
使用内存作ؓ~存区将可以提供更好的性能
使用盘作ؓ~存区可以在服务器重起后q速恢复缓存内?
同时使用内存和硬盘作为缓存区则可以减对内存的占?
3. 灉|的缓存系l?
OSCache支持寚w分页面内Ҏ者对面U的响应内容q行~存Q编E者可以根据不同的需求、不同的环境选择不同的缓存别?
4.
定w
在一般的web应用中,如果某个面需要和数据库打交道Q而当客户h到达Ӟweb应用和数据库之间无法q行交互Q那么将q回l用?
pȝ出错"或者类似的提示信息Q如果用了OSCache的话Q你可以使用~存提供l用Pl自p得维护系l或者采取其他补救的旉?
其它Ҏ还包括寚w的支持、缓存主动刷新等Ҏ,大家可以参考OpenSymphony|站上的其他资源获取更多的信息?
3
OSCachelg的安?
OSCache是一个基于web应用的组Ӟ他的安装工作主要是对web应用q行配置Q大概的步骤如下Q?
1. 下蝲、解压羃OSCache
请到OSCache的主http://www.opensymphony.com/oscache/download.html下蝲Oscache的最新版本,作者下载的是OSCache的最新稳定版?.0?
下载后的。Zip文g解压~到c:"oscacheQ后面的章节中将使用%OSCache_Home%来表C个目录)目录?
2.
新徏立一个web应用
3. 主要组?OSCache_Home%"oscache.jar攑օWEB-INF"lib目录
4.
commons-logging.jar、commons-collections.jar的处?
OSCachelg用Jakarta Commons
Logging来处理日志信息,所以需要commons-logging.jar的支持,请将%OSCache_Home%"lib"core"commons-logging.jar攑օclasspathQ通常意味着这个文件放入WEB-INF"lib目录Q?
如果使用JDK1.3,请将%OSCache_Home%"lib"core"commons-collections.jar攑օclasspathQ如果用JDK1.4或者以上版本,则不需要了
5. oscache.properties、oscache.tld攑օWEB-INF"class目录
%OSCache_Home%"oscache.properties包含了对OSCacheq行特征值的讄信息
%OSCache_Home%"oscache.tld包含了OSCache提供的标{ֺ的定义内?
6. 修改web.xml文g
在web.xml文g中增加下面的内容Q增加对OSCache提供的taglib的支持:
<taglib>
<taglib-uri>oscache</taglib-uri>
<taglib-location>/WEB-INF/classes/ oscache.tld</taglib-location>
</taglib>
4 开始用OSCache中的~存lg
OSCache中按照缓存范围的不同分ؓ两种不同的方式:一U是~存JSP面中部分或者全部内容,一U是Z整个面文g的缓存?
4.1 JSP部分内容~存
4.1.1 Cache-OSCache提供的缓存标{?
q是OSCache提供的标{ֺ中最重要的一个标{,包括在标{中的内容将应用~存机制q行处理Q处理的方式取决于~程者对cache标签属性的讄?
W一ơ请求到达时Q标{中的内容被处理q且~存hQ当下一个请求到达时Q缓存系l会查这部分内容的缓存是否已l失效,主要是以下几:
1. ~存旉过了cache标签讄的time或者duration属性规定的时旉
2.
cron属性规定的旉比缓存信息的开始时间更?
3. 标签中缓存的内容在缓存后又被重新hq?
4. 其他~存期讑֮
如果W合上面四项中的M一,被缓存的内容视ؓ已经失效Q这时被~存的内容将被重新处理ƈ且返回处理过后的信息Q如果被~存的内Ҏ有失效,那么q回l用L是~存中的信息?
cache标签的属性说?
key -
标识~存内容的关键词。在指定的作用范围内必须是唯一的。默认的key是被讉K面的URI和后面的h字符丌Ӏ?
你可以在同一个页面中使用很多cache标签而不指定他的key属性,q种情况下系l用该面的URI和后面的h字符Ԍ另外再自动给q些key增加一个烦引值来区分q些~存内容。但是不推荐采用q样的方式?
scope - ~存发生作用的范_可以是application或者session
time -
~存内容的时间段Q单位是U,默认?600U,也就是一个小Ӟ如果讑֮一个负|那么q部分被~存的内容将永远不过期?
duration -
指定~存内容失效的时_是相对time的另一个选择Q可以用简单日期格式或者符合USO-8601的日期格式。如Qduration='PT5M'
duration='5s'{?
refresh - false 或者true?
如果refresh属性设|ؓtrueQ不其他的属性是否符合条Ӟq部分被~存的内定w被更新Q这l编E者一U选择Q决定什么时候必d新?
mode - 如果~程者不希望被缓存的内容增加到给用户的响应中Q可以设|mode属性ؓ"silent"
其它可用的属性还包括Qcron 、groups、language、refreshpolicyclass、refreshpolicyparam?
上面的这些属性可以单独用,也可以根据需要组合用,下面的例子将讲解q些常用属性的使用方式?
4.1.2
Cache标签实例分析:
1. 最单的cache标签用法
使用默认的关键字来标识cache内容Q超时时间是默认?600U?
<cache:cache>
<%
//自己的JSP代码内容
%>
</cache:cache>
2.
用自己指定的字符串标识缓存内容,q且讑֮作用范围为session?
<cache:cache key="foobar"
scope="session">
<%
//自己的JSP代码内容
%>
</cache:cache>
3.动态设定key|使用自己指定的time属性设定缓存内容的时旉Q用动态refresh值决定是否强制内容刷新?
因ؓOSCache使用key值来标识~存内容Q用相同的key值将会被认ؓ使用相同的的~存内容Q所以用动态的key值可以自qҎ不同的角艌Ӏ不同的要求军_使用不同的缓存内宏V?
<cache:cache key="<%= product.getId() %>" time="1800"
refresh="<%= needRefresh %>">
<%
//自己的JSP代码内容
%>
</cache:cache>
4. 讄time属性ؓ负数使缓存内Ҏ不过?
<cache:cache
time="-1">
<%
//自己的JSP代码内容
%>
5. 使用duration属性设|超期时?
<cache:cache duration='PT5M'>
<%
//自己的JSP代码内容
%>
6. 使用mode属性被缓存的内容不加入给客户的响应中
<cache:cache mode='silent'>
<%
//自己的JSP代码内容
%>
4.2 用CashFilter实现面U缓?
在OSCachelg中提供了一个CacheFilter用于实现面U的~存Q主要用于对web应用中的某些动态页面进行缓存,其是那些需?
生成pdf格式文g/报表、图片文件等的页面,不仅减少了数据库的交互、减数据库服务器的压力Q而且对于减少web服务器的性能消耗有很显著的效果?
q种功能的实现是通过在web.xml中进行配|来军_~存哪一个或者一l页面,而且q可以设|缓存的相关属性,q种Z配置文g的实现方式对于J2EE来说应该是一U标准的实现方式了?
[注] 只有客户讉K时返回http头信息中代码?00Q也是讉K已经成功Q的面信息才能够被~存
1. ~存单个文g
修改web.xmlQ增加如下内容,定?testContent.jsp面q行~存?
<filter>
<filter-name>CacheFilter</filter-name>
<filter-class>com.opensymphony.oscache.web.filter.CacheFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CacheFilter</filter-name>
<!-?testContent.jsp面内容q行~存-->
<url-pattern>/testContent.jsp</url-pattern>
</filter-mapping>
2. ~存URL pattern
修改web.xmlQ增加如下内容,定?.jsp面q行~存?
<filter>
<filter-name>CacheFilter</filter-name>
<filter-class>com.opensymphony.oscache.web.filter.CacheFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CacheFilter</filter-name>
<!-Ҏ有jsp面内容q行~存-->
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
3. 自己讑֮~存属?
在页面~存的情况下Q可以通过讄CacheFilter的初始属性来军_~存的一些特性:time属性设|缓存的旉D,默认?
3600U,可以Ҏ自己的需要只有的讄Q而scope属性设|,默认为applicationQ可选项包括application、session
<filter>
<filter-name>CacheFilter</filter-name>
<filter-class>com.opensymphony.oscache.web.filter.CacheFilter</filter-class>
<init-param>
<param-name>time</param-name>
<param-value>600</param-value>
</init-param>
<init-param>
<param-name>scope</param-name>
<param-value>session</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CacheFilter</filter-name>
<!-Ҏ有jsp面内容q行~存-->
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
5 性能试l果
5.1 试环境
pȝq_Qwindows 2000 高服务? P3 800 /512M内存
web服务器:websphere 5.0
数据库服务器Qmysql 4.0.18-nt
性能试用工Papache Jmeter
5.2 试计划
q次性能试Ҏ方ؓ使用~存和不使用~存两种Q他们的讉K代码都是一LQ通过数据源从本地mysql数据库中获取person表的所有记录,然后昄在页面上?
试中将模仿10个用P每个用户发v5ơ请求,然后l计所有访问花费的旉?
5.3 试l果
使用~存后的试l果 不用缓存时的测试结?
所有请求花费的L?毫秒) 20569 22870
性能试的详l结果请大家查看下蝲内容中的《不使用cache时的pȝ性能试l果.txt》和《用cache后系l性能试l果.txt?
6 ȝ
在J2EEpȝ中,我们l常需要处理一些特D的动态内容,q些内容在一个时间段内的变更非常有限Q但是又不得不将他们定为动?
内容q行输出Q而且非常消耗数据库pȝ资源或者web服务器的资源Q这时我们就可以采用Cache----一U用于提高系l响应速度、改善系l运行性能?
技?---来优化我们的pȝ。尤其是在Web应用中,q种处理可以很显著的改善pȝq行性能?
本文中作者给大家介绍一个实现J2EE框架中Web应用层缓存功能的开放源代码目----OSCache。它提供了在J2EEpȝ
中实现缓存需要的丰富的功能。通过应用OSCacheQ我们不但可以实现通常的Cache功能、自q讑֮cache的相关特性比如缓存时间段/~存内容
{,提升pȝ性能Q而且q能有效的改善系l的E_性。除此之外,OSCachelgq提供了更多的特性比如集、容错、灵zȝ~存区选择{?
作者根据自q使用l验l大家提供了一些简单的例子Q他们部分演CZ如何使用OSCachelg提供的丰富特性,OSCache提供的特性远不止q些Q需要大家在今后的时间里深入的研IӞ同时也希望大安过E-mail和作者A献研I成果?nbsp;
]]> 【{】OSCache?/title> http://www.tkk7.com/gen-sky/articles/285801.html星期?/dc:creator>星期?/author>Tue, 07 Jul 2009 05:48:00 GMT http://www.tkk7.com/gen-sky/articles/285801.html http://www.tkk7.com/gen-sky/comments/285801.html http://www.tkk7.com/gen-sky/articles/285801.html#Feedback 0 http://www.tkk7.com/gen-sky/comments/commentRss/285801.html http://www.tkk7.com/gen-sky/services/trackbacks/285801.html
OSCache是OpenSymphonyq个开源项目众多Projects中的一个。他是一个高效的J2EE~存框架Q能够很好的解决动态网站速度的问题。下面来
看下OSCache解决了动态网站的哪些令h郁闷的问题?br />
1.~存动态内容:其实我们的动态网上一般只有一部分是动态的Q表_表尾一般是不变的)Q如果我们缓存整个网|然不成,因ؓ有部分是
随着h有可能变的。OSCache提供的方式是允许我们只缓存一部分|页?br />
2.~存2q制内容Q生的囄和PDF文g在服务器加蝲的时候非常的耗时。OSCache解决q个问题是通过一个Servlet2.3的缓存过滤功能,然后?br />
够缓存Q意的URIQ比如一个完整的面或者是一个生的囄/PDF文gQ?br />
3.定wQ有q种情况或许我们会遇刎ͼ是当一个动态的|页出现错误。即便我们的面?5%都加载完毕,但就是由于这个错误,整个面׃
q回错误的提C或面。OSCache允许我们提供出现错误时的~存内容Q如果出现就适时的提C出来了?br />
除了上面的这些Servlet的特征外QOSCache完全可以充当M一个javaE序的缓存方案。OSCache 的一般特征如下:
1.~存L对象Q可以不受限制的~存JSP的一部分或是HttphQQ何的Java对象都可以被~存?br />
2.全面的APIQ通过API可以完完全全的控制OSCache的Q何特性?br />
3.持久~存Q我们可以把认ؓ重要的数据缓存到盘上?br />
4.支持集群Q集缓存数据能被单个的q行参数配置Q不需要修改代码?br />
5.~存记录的过期:你可以有最大限度的控制~存对象的过期,包括可插入式的刷新策略(如果默认性能不需要时Q?br />
?OSCacheq行环境
如果用到OSCache Tag Library的话Q需要Servlet2.3和JSP1.2的支持。如果是直接用OSCache API的话那么׃需要Servlet容器的支持?br />
目前可以正常q行的Web容器Q?br />
1.OrionServer(版本1.4.0和更?
2.JRun(3.0或更?
3.WebLogic(8.1或以?
4.Websphere(5.0或以?
5.Resin(1.2.3或以?
6.TomCat(4.0或以?
7.iPlanet(6.0或以?
用到~存qo需要Servlet2.3支持.目前知道的可以个工作在OrionServer,WebLogic,Tomcat?
OSCache需要Java的版本至是java 1.4.
?OSCache的安?br />
1.解压oscache-2.4.1-full
2.把oscache-2.4.1.jar攑ֈ/WEB-INF/lib?
3.要确保commons-logging.jar也在环境变量?一般情况下他也攑֜/WEB-INF/lib?
4.?etc/oscache.properties攑օ/WEB-INF/classes?如果用的Eclipse的话,新徏一个Source Folder比如叫Src_Config,然后p个OSCache的属性文件放在其?通过修改q个OSCache的配|文件可以改变文件缓存的盘路径,配置持久侦听{等.
5.把etc/META-INF/oscache.tld也放?WEB-INF/classes?
?OSCache应用学习
1.JSP的应?br />
要是惛_用OSCache的标{?我们必须先要引入q来.方式有两U?
其一.在web.xml中加?
<taglib>
<taglib-uri>oscache</taglib-uri>
<taglib-location>/WEB-INF/classes/oscache.tld</taglib-location>
</taglib>
然后我们在JSp中就可以<%@ taglib uri="oscache" prefix="os"%>q样来引用了.
其二,直接引用.直接在JSp中加入OSCache的标{ֺ引用
<%@ taglib uri="/WEB-INF/classes/oscache.tld" prefix="os"%>.如果要进入官方的标签库的话也?<%@ taglib uri="http://www.opensymphony.com/oscache" prefix="cache" %>q样׃用再把oscache.tld攑֜/WEB-INF/classes下了.
目前OSCache?个标{?他们是cache, usecached, flush, addgroup, addgroups.下面我们来分别介l一下他们的属性和用法.
<cache></cache>
他是OSCache中最主要的标{了.括v来的内容根据属性的讄来缓存v?W一ơ执行的时?OSCache会把cache标签中的JSp执行q且~存h,以后再执行的?他会首先判断~存的内Ҏ否过?如果q期那么会从新执行ƈ~存.否则q接从~存中读?判定q期的条件如?
i.~存的内容超q了属性time所指定的时?
ii.不符合cron讄的时间间?
iii.如果scope指定的范围刷新的?则认期了.如Sessionq期.
属性如?
key : ~存的Key,可以是Q何的字符,用来L~存的内容用?可以理解成HashMap中的Key.不能?个要~存的东东定义成一个名?那样后一个会覆盖前一个的内容.默认情况,如果不指定Key的话,OSCache也会自动生成一个Key,规则是请求的URI+当前面的Query String.
scope : ~存的范??? application和session.默认值是application.
time : ~存内容的时?以秒为单?默认?600U?C指定的时?׃h~存内容.如果指定一个负数的?意味着永远不会q期.
duration : 也是用来指定~存内容的时?它和time属性只能是2?,它的特点是可以用Simple Data Format 或者是ISO-8601q行日期格式?
cron : 用万q历的Ş式指定缓存内容何时过期的.它应用的Unix的万q历形式,?"0 * * * *")
refresh : 是个Boolean?如果是True的话,则不前面提到的q期?都刷?默认情况是false.
mode : 讄q项?#8221;silent”防止把括v来的内容输出.q在你预加蝲~存内容而不愿显C给用户看到时很有用.
groups : 可以提供一个以逗号分割的组名称.如group="A, B".q将允许你以l的名义来操作他?分组非常有用,比如你要~存的内Ҏ好需要另外一个应用程序的一部分或数?当依赖的发生了改?正好联动的可以很多的组q期,q而与组发生兌的缓存内容得到更?
language : 讄~码方式.
refreshpolicyclass:指定自定义的cL处理~存的内容什么时候过?q个c需要从 refreshpolicyparam com.opensymphony.oscache.web.WebEntryRefreshPolicyl承.
refreshpolicyparam : 它和上面的是联合使用?是给refreshpolicyclass传Q意的参数?指定q项的话,必Lrefreshpolicyclass,否则׃起作?
属性就q么多了,下面丑և个应用的例子:
<os:cache key="<%=myKey%>" time="1800" refresh="<%=needRefresh%>">
<!--q里是要~存的内?->
</os:cache>
q里myKey标识的缓存内容保?0分钟,到期自动h.如果needRefresh为true也会h(适合于更新内容的xh).
<os:cache key="<%=myKey%>" cron="0 2 * * *" refresh="<%=needRefresh%>">
<!--q里是要~存的内?->
</os:cache>
myKey标识的缓存内容在每天的凌?时自动刷?如果needRefresh为true也会h(适合于更新内容的xh).
丑ֈ了这个例?我不得不把cron表达式多说几?首先q五颗星的位|代?br />
?时,一个月中的??一周中的天
? 无疑?~59.
时 : 无疑?0~23.
?? : 1~31
?: 1~12,用英文全UC可以.如January, April
??: 0~6(0代表Sunday; 1代表Monday… 6代表Saturday)
举个例子,比如我们惌~存的内容在4月的晚上11:45分过?我们可以q样来写
"45 23 * April *".
<usecached />
需要放在cache标签中嵌套?一般配合try..catch使用)告诉他的上标签是否应用~存的译? 则出现异常时会替换包括上标签在内的所有内?提示:Missing cached content). use="true|false" : 是否应用的标? 默认为True.一般省?
应用例子:
<os:cache>
..内容..
<% try {%>
......其它内容
<%}catch (Exception e) {%>
Inside catch: <os:usecached use="<%=isUsed%>"/> YES
<% } %>
</os:cache>
则出现异常时的页面输出有两种:
1>. isUsed=false
..内容..
......其它内容
Inside catch: YES
2>. isUsed=true
Missing cached content
<flush />
q个标签是用于在q行时状态下h~存?q个标签非常有用,因ؓ它可以放在WebE序的管理部分ɽ理员可以决定何时刷新缓?
属性如?
scope : h的范?3个? "application", "session" and null .null表示h所?
Key : 和scope联合使用,h指定范围的指定缓?如果不指定scope则key无效.
group : 和scope联合使用, h指定范围的指定组中的~存. 不指定scope无效.
Pattern :M包含了pattren指定的字W串的缓存都被更?它也是和scopeq用.但是现在官方不赞成再用这个属性了.用group完全可以取代q个.便于理.
language : 讄~码方式
丑և个应用的例子:
h整个application.
<os:flush scope="application" />
hsession中的foobarq个~存.
<os:flush scope="session" key="foobar" />
在application 中刷新所有currencyData l中的缓?br />
<os:flush scope="application" group="currencyData" />
<addgroup />
q个标签也是必须嵌套在cache标签中的.把缓存的东东攑օ到指定的l中.q样可以以l来h指定的内容了.
属性只有group来指定名字的.例子如下:
把test1加入到group1和group2?br />
<os:cache key="test1">
< os:addgroup group="group1" />
... some jsp content ...
< os:addgroup group="group2" />
... some more jsp content ...
</ os:cache>
<addgroups /> (2.3及以后的版本中新加的)
同上面的功能相同,只不q可以不用一个一个加group?例子如下:
< os:cache key="test1">
... some jsp content ...
< os:addgroups groups="group1,group2" />
... some jsp content ...
</ os:cache>
2.API的应?br />
在实际应用中除了JSP标签库和CacheFilter(下面介绍)?q可以用OSCache提供的Java API .下面我来介绍一个实用的Javac?,使用GeneralCacheAdministrator来徏?h和管理缓? GeneralCacheAdministrator可以被实例化,里面有很多的实用Ҏ.此外它还理加蝲cache.propertiesq且Ҏq个属性文件创Z个缓存实?因此你最好用单例模式来创徏GeneralCacheAdministrator实例.
主要用到的GeneralCacheAdministrator的方法有
public Object getFromCache(String key) throws NeedsRefreshException; -- 从缓存中获取一个key标识的对?
public Object getFromCache(String key, int refreshPeriod) throws NeedsRefreshException ; -- 从缓存中获取一个key标识的对? refreshPeriodh周期,标识此对象在~存中保存的旉(单位:U?
public void putInCache(String key, Object content) -- 存储一个由Key标识的缓存对?
public void putInCache(String key, Object content, String[] groups) -- 存储一个由Key标识的属于groups中所有成员的~存对象.
public void flushEntry(String key) -- 更新一个Key标识的缓存对?
public void flushGroup(String group) --更新一l属于groupr标识的所有缓存对?
public void flushAll() -- 更新所有缓?
public void cancelUpdate(String key) --- 取消更新 只用于在处理捕获的NeedsRefreshException异常q尝试生成新~存内容失效的时?
public void removeEntry(String key) ---从缓中移除一个key标识的对?br />
public void clear() --- 清除所有缓?br />
官方的用例?
///采取补救措施的典型方?br />
String myKey = "myKey";
String myValue;
int myRefreshPeriod = 1000; //h周期1000U?br />
try {
//从Cache中获?要做cd转换
myValue = (String) admin.getFromCache(myKey, myRefreshPeriod);
} catch (NeedsRefreshException nre) {
try {
// Cache中没有则从库获得数据.
myValue = "This is the content retrieved.";
// 存放在Cache?键值myKey
admin.putInCache(myKey, myValue);
} catch (Exception ex) {
// 试恢复Cache中的内容
myValue = (String) nre.getCacheContent();
// 如果Cache中的内容没有复原 则用q个lҎ
admin.cancelUpdate(myKey); //取消对myKey的更?即类似数据回?br />
}
}
///不采取补救措施的典型Ҏ
String myKey = "myKey";
String myValue;
int myRefreshPeriod = 1000;
try {
//从Cache中获?要做cd转换
myValue = (String) admin.getFromCache(myKey, myRefreshPeriod);
} catch (NeedsRefreshException nre) {
try {
// Cache中没有则从库获得数据.
myValue = "This is the content retrieved.";
// 存放在Cache?键值myKey
admin.putInCache(myKey, myValue);
updated = true;
} finally {
if (!updated) {
// 如果Cache中的内容更新出现异常 则用q个lҎ
admin.cancelUpdate(myKey); //取消对myKey的更?即类似数据回?br />
}
}
}
注意:
如果一个NeedsRefreshException出现 必须调用admin.putInCache或甚至admin.cancelUpdate来避免死锁情况发?
3.CacheFilter的应?br />
OScache可以是你很轻易的~存|站中全部页?甚至是那些二q制文g.?.4版本开始你可以在运行期讄和覆盖CacheFilter的初始化参数.注意,只有q回状态ؓ200的页面才会缓? (HttpServletResponse.SC_OK).
配置CacheFilter,在Web.xml中加入如?
<filter>
<filter-name>CacheFilter</filter-name>
<filter-class>com.opensymphony.oscache.web.filter.CacheFilter</filter-class>
<init-param>
<param-name>time</param-name>
<param-value>600</param-value>
</init-param>
<init-param>
<param-name>scope</param-name>
<param-value>session</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CacheFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
q个例子在session范围~存所有JSp10分钟.默认情况scope为application,旉?时.
如果ICacheKeyProvider不设|的?q个CacheFilter?URI+QueryString)作ؓ~存Key.
你可以用下列的初始化参数来讄CacheFilter:
Parameter: time
讄~存旉,默认?个小?可以讄?1(不确?.q样他就不会q期?除非你明刷新它(前面说到的refresh =”true”).或者是更改q个h的策?
Parameter: scope
同cache的scope. 也是有application(default)和session
Parameter: cron (NEW! Since 2.3)
同cache的scope.讄q期
Parameter: fragment (NEW! Since 2.2)
作用不太清除,用默认即?
Parameter: nocache (NEW! Since 2.2)
定义那些面不需要缓?”off”---~存所?”sessionIdInURL”---如果session中包括这URL的则不缓存这个页?br />
Parameter: lastModified (NEW! Since 2.2)
定义是否把Header发送到Response?
"off"----不发?即便它设|在qo链中.
"on"----如果在过滤链中则发?
"inital"(default)----最后更改的信息基于当前时间被讄
Parameter: max-age (NEW! Since 2.3.1)
讄在浏览器中缓存的最大时?在设|的期间,不再向服务器h,而是从自q~存中查N?默认?0U?
Parameter: expires (NEW! Since 2.2)
定义q期header发送到Response中的旉.
"off"----不发?
"on"(default)---如果在过滤链中则发?q且timeq个q期信息基于时间参数和面内容的创建时间初始化.
Parameter: ICacheKeyProvider (NEW! Since 2.2)
指定实现ICacheKeyProvider接口的类.
Parameter: ICacheGroupsProvider (NEW! Since 2.2)
指定实现ICacheGroupsProvider接口的类
Parameter: EntryRefreshPolicy (New! Since 2.3)
指定实现EntryRefreshPolicy接口的类.
Parameter: disableCacheOnMethods (New! Since 2.4)
指定h方式不进行缓?默认Null,Ҏ有的h方式都缓?例如:
<init-param>
<param-name>disableCacheOnMethods</param-name>
<param-value>POST,PUT,DELETE</param-value>
</init-param>
Parameter: oscache-properties-file (New! Since 2.4)
通过指定OSCache的属性文?开发者就能运行多个CacheFilter
4.OSCache的属性文?(oscache.properties)
cache.memory
gؓtrue或false.默认为true.如果讄为false那么~存到数据库或硬盘中.g有点?所以我们一般不Ҏ?
cache.capacity
~存元素的个?默认是没有限制的.
cache.algorithm
~存的算?注意要是指定法的话,必须把上面的~存个数指定.q里支持三种法.
com.opensymphony.oscache.base.algorithm.LRUCache – 最后最q?br />
com.opensymphony.oscache.base.algorithm.FIFOCache – 先进先出
com.opensymphony.oscache.base.algorithm.UnlimitedCache – 无限~存
cache.blocking
是否同步化。true 或?false。一般设为trueQ避免读取脏数据?br />
cache.unlimited.disk
指定盘~存是否要作限制。默认gؓfalse。false的状况下Qdisk cache capacity 和cache.capacity的值相同?br />
cache.persistence.class
指定cL被持久化的类。class必须实现PersistenceListener接口。作为硬盘持久,可以实现 com.opensymphony.oscache.plugins.diskpersistence.HashDiskPersistenceListener 接口。它把class的toString()输出的hashg为文件的名称。如果你要把文g名易读(自己讑֮Q,DiskPersistenceListener 的父cM 能用,但其可能有非法字W或者过长的名字。注意:HashDiskPersistenceListener ?DiskPersistenceListener 需要设定硬盘\径:cache.path
cache.path
指定盘~存的\径。目录如果不存在被建立。同时注意oscache应该要有权限写文件系l?cache.path=c:""myapp""cache or *ix: cache.path=/opt/myapp/cache
cache.persistence.overflow.only (NEW! Since 2.1)
指定是否只有在内存不的情况下才使用盘~存?默认值false。但推荐是true如果内存cache被允许的话。这个属性彻底的改变了cache的行为,使得persisted cache 和memory完全不同?br />
cache.event.listeners
用逗号分离的class名列表。每个class必须实现以下接口之一Q或者几?CacheEntryEventListenerQ接收cache add/update/flush and remove事g CacheMapAccessEventListener Q接收cache讉K事g。这个可以让你跟tcache怎么工作?默认是不配置Mclass的。当然你可以使用一下的classQ?com.opensymphony.oscache.plugins.clustersupport.BroadcastingCacheEventListener Q分布式?此处被屏?。可以广播到局域网内的其他cache实例?com.opensymphony.oscache.extra.CacheEntryEventListenerImpl Q一个简单的(此处被屏?。在cache的生命周期中记录count of 所有entry的事件?com.opensymphony.oscache.extra.CacheMapAccessEventListenerImpl Q记录count of cache map eventsQcache hitsQmisses and state hitsQ?
cache.key
讄ServletCacheAdministrator使用的Key.在代码中如果需要用到的?可以通过com.opensymphony.oscache.web.ServletCacheAdministrator.DEFAULT_CACHE_KEY得到.
cache.use.host.domain.in.key
如果你的服务器是被配|到多台L上的?你或许想加上一个主机的名字在它生成的缓存Key?true的话会加?默认值是false.
附加的属? cache.cluster.multicast.ip, cache.cluster.properties
5.结:
OSCache的用主要有4U:
POJO ~存
HTTP Response ~存
JSP Tag Library ~存
O/R Data Access ~存
1)、POJO ~存
q种方式的缓存直接调用OSCache的APIq行Q主要用于处理页面内容会Ҏ参数动态改变,可以参数设|ؓkey值来保存数据Q?br />
首先Q声明成员变量:
// OSCache Adminitrator instance
private static GeneralCacheAdministrator cacheAdmin = null;
其次Q进行初始化Q?br />
public RingArtistAction() {
cacheAdmin = new GeneralCacheAdministrator();
}
POJOq行~存Q?br />
// Cache data key and refresh period
String key = sex + ":" + place;
int refreshPeriod = Constants.getIntegerValue(Constants.OSCACHE_REFRESH_PERIOD).intValue();
try {
// Get from the cache
artists = (Map) cacheAdmin.getFromCache(key, refreshPeriod);
} catch (NeedsRefreshException nre) {
try {
// Get the value (probably from the database)
int count = getArtistCount(sex, place, errors);
artists = getArtistData(sex, place, count, errors);
// Store in the cache
cacheAdmin.putInCache(key, artists);
} catch (Exception ex) {
// We have the current content if we want fail-over.
artists = (Map) nre.getCacheContent();
// It is essential that cancelUpdate is called if the
// cached content is not rebuilt
cacheAdmin.cancelUpdate(key);
ex.printStackTrace();
}
}
2)、HTTP Response ~存
q种方式的缓存用来处理整个页面的内容固定Q不会根据参数动态改变:
首先在web.xml中配|CacheFilterQ?br />
<filter>
<filter-name>CacheFilter</filter-name>
<filter-class>com.opensymphony.oscache.web.filter.CacheFilter</filter-class>
<init-param>
<param-name>time</param-name>
<param-value>86400</param-value>
</init-param>
<init-param>
<param-name>scope</param-name>
<param-value>application</param-value>
</init-param>
</filter>
所有需要缓存的面加入filter-mappingQ?br />
<filter-mapping>
<filter-name>Set Character Encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
注意Q只有返回状态ؓ200QHttpServletResponse.SC_OKQ的内容才会被缓?br />
3)、JSP Tag ~存
JSP Tag~存主要用于~存JSP面的局部内容:
<cache:cache key="especialcategory" cron="* 5 * * *">
<jsp:include page="/ringcategory.do" flush="true" >
<jsp:param name="ringType" value="1"/>
</jsp:include>
</cache:cache>
4)、O/R Data Access ~存
请阅d考资料的内容获取详情.
]]>
վ֩ģ壺
Ƶһ |
jizzһ |
þþþƷƵ |
Ƶһ |
wwwѻɫ |
Ʒav߹ۿ |
Ƶ
|
պ߹ۿ |
ŮƷĻ |
պëƬƵ |
ڵƵ߹ۿ |
ŷƷպһҹҹ |
ŮƵaƵȫվɫ |
A |
һ˿wwwƵ |
վWWW߹ۿ |
aaŮ˴ƬˮƵ |
AVۺɫһ |
ŮպѲ |
һ24鶹 |
ĻѴƬa |
רëƬ߳ˮ |
AƬ777777 |
þþþþùaѹۿɫƬ
|
ؼƷëƬѹۿ |
ƷŮ |
AVƬ |
WWWƵ߹ۿ |
Ʒa߹ۿ |
Ƶһ
|
þþѵľƷ |
ŷ ͼƬۺ |
ֳִִӲƵ |
һƵѹۿ |
Ůۺ99 |
avĻ |
þþþþùƷͬ
|
߹ۿ |
þù߳ѹۿ |
mv |
Ʒ³ĵӰ |