Cache是一U用于提高系l响应速度、改善系l运行性能的技术。尤其是在Web应用中,通过~存面的输出结果,可以很显著的改善pȝq行性能。本文中作者给大家介绍一个实现J2EE框架中Web应用层缓存功能的开放源代码目----OSCache。通过应用OSCacheQ我们不但可以实现通常的Cache功能Q还能够改善pȝ的稳定性?/p>
在信息系l徏设过E中我们通常?x)遇到这L(fng)问题Q?/p>
1. 基础数据的变更问?/strong>
信息pȝ中需要处理的基础数据的内容短旉内是不会(x)发生变化的,但是在一个相寚w一些的旉里,它却可能是动态增加或者减的?/p>
举个例子Q电(sh)子商务中关于送货区域的定义,可能短时间内不会(x)发生变化Q但是随着?sh)子商务企业业务的扩大,pȝ中需要处理的送货区域可能增加。所以我们的pȝ中不得不在每ơ向客户展示送货区域信息的时候都和数据库Q假N货区域信息保存在数据库中,q也是通常采用的处理方法)(j)q行交互?/p>
2. l计报表Q不仅限于统计报表)(j)的问?/strong>
一般来_(d)l计报表是一个周期性的工作Q可能是半个月、一个月或者更长的旉才会(x)需要更Cơ,然而统计报表通常是图形显C或者是生成pdf、word、excel{格式的文gQ这些图形内宏V文件的生成通常需要消耗很多的pȝ资源Q给pȝq行造成很大的负担?/p>
通过比较分析Q不隑֏现这两类问题有一些共同点Q?/p>
1、被处理的内容短旉不变Q所以短旉内可以作为静(rn)态内容进行处?/p>
2、在一个不太长的时间内Q被处理的内容可能或者必定生变化,所以必d他们作ؓ(f)动态内容进行处?/p>
3、在合理的时间区D内可以忽略被处理内容变化后带来的媄(jing)?/p>
4、对q些内容的处理动作比较消耗系l性能Q媄(jing)响系l响应时?/p>
~存技术可以帮助我们很好的解决q个问题Q?/p>
1、缓存(sh)?/p>
当上q的基础数据或者统计报表第一ơ被讉KӞ被处理的内容被当作动态信息,基础数库从数据库中获得,l计报表也会(x)被生成符合要求的囑Ş、文Ӟ然后q些信息都会(x)被放入缓存(sh)息中?/p>
2、响应信息由~存提供
当上q的基础数据或者统计报表l被讉KӞpȝ会(x)首先(g)查缓存(sh)息中是否有对应的内容和我们设定的~存规则Q如果符合缓存(sh)息存在而且W合~存规则Q给出的响应来自于~存?sh)息Q如果没有或者缓存(sh)息已l不W合讑֮的要求,pȝ重复上一步的动作?/p>
很显?dng)上面的步?中,多数情况下,当用戯求到达时Q被处理的内容将来自于缓存,所以大大的减少?jin)与数据库的交互Q或者不再需要ؓ(f)每个h都生成一ơ报表图形或者文Ӟq部分工作的减少对于降低pȝ性能消耗、提高系l稳定性和q发处理能力是非常有益的?/p>
OSCache是OpenSymphonyl织提供的一个J2EE架构中Web应用层的~存技术实现组Ӟ它的出现解决?jin)我们面临的问题?OSCache目前最新的E_版本?.0Q本文中的例子都是基于这个版本的Q如果大家运行例子的q程中发生问题,请首先确认是否采用了(jin)正确的Y件版本?/p>
1. 兼容多种支持JSP的web服务?/p>
已经通过兼容试的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的?/p>
2. 可选的~存?/p>
你可以用内存、硬盘空间、同时用内存和盘或者提供自q其他资源Q需要自己提供适配器)(j)作ؓ(f)~存区?/p>
3. 灉|的缓存系l?/p>
OSCache支持寚w分页面内Ҏ(gu)者对面U的响应内容q行~存Q编E者可以根据不同的需求、不同的环境选择不同的缓存别?/p>
4. 定w
在一般的web应用中,如果某个面需要和数据库打交道Q而当客户h到达Ӟweb应用和数据库之间无法q行交互Q那么将q回l用?pȝ出错"或者类似的提示信息Q如果用了(jin)OSCache的话Q你可以使用~存提供l用Pl自p得维护系l或者采取其他补救的旉?/p>
其它Ҏ(gu)还包括寚w的支持、缓存(sh)动刷新等Ҏ(gu),大家可以参考OpenSymphony|站上的其他资源获取更多的信息?/p>
OSCache是一个基于web应用的组Ӟ他的安装工作主要是对web应用q行配置Q大概的步骤如下Q?/p>
1. 下蝲、解压羃OSCache
请到OSCache的主?a >http://www.opensymphony.com/oscache/download.html http://www.bt285.cn/content.php?id=1196863 http://www.5a520.cn
下蝲Oscache的最新版本,作者下载的是OSCache的最新稳定版?.0?/p>
下载后的。Zip文g解压~到c:oscacheQ后面的章节中将使用%OSCache_Home%来表C个目录)(j)目录?/p>
2. 新徏立一个web应用
3. 主要组?OSCache_Home%oscache.jar攑օWEB-INFlib目录
4. commons-logging.jar、commons-collections.jar的处?/p>
5. oscache.properties、oscache.tld攑օWEB-INFclass目录
6. 修改web.xml文g
在web.xml文g中增加下面的内容Q增加对OSCache提供的taglib的支持:(x)
<taglib> <taglib-uri>oscache</taglib-uri> <taglib-location>/WEB-INF/classes/ oscache.tld</taglib-location> </taglib> |
OSCache中按照缓存范围的不同分ؓ(f)两种不同的方式:(x)一U是~存JSP面中部分或者全部内容,一U是Z整个面文g的缓存?/p>
q是OSCache提供的标{ֺ中最重要的一个标{,包括在标{中的内容将应用~存机制q行处理Q处理的方式取决于~程者对cache标签属性的讄?/p>
W一ơ请求到达时Q标{中的内容被处理q且~存hQ当下一个请求到达时Q缓存系l会(x)(g)查这部分内容的缓存是否已l失效,主要是以下几:(x)
如果W合上面四项中的M一,被缓存的内容视ؓ(f)已经失效Q这时被~存的内容将被重新处理ƈ且返回处理过后的信息Q如果被~存的内Ҏ(gu)有失效,那么q回l用L(fng)是~存?sh)的信息?/p>
cache标签的属性说?
key - 标识~存内容的关键词。在指定的作用范围内必须是唯一的。默认的key是被讉K面的URI和后面的h字符丌Ӏ?/p>
你可以在同一个页面中使用很多cache标签而不指定他的key属性,q种情况下系l用该面的URI和后面的h字符Ԍ另外再自动给q些key增加一个烦(ch)引值来区分q些~存内容。但是不推荐采用q样的方式?/p>
scope - ~存发生作用的范_(d)可以是application或者session
time - ~存内容的时间段Q单位是U,默认?600U,也就是一个小Ӟ如果讑֮一个负|那么q部分被~存的内容将永远不过期?/p>
duration - 指定~存内容失效的时_(d)是相对time的另一个选择Q可以用简单日期格式或者符合USO-8601的日期格式。如Qduration='PT5M' duration='5s'{?/p>
refresh - false 或者true?/p>
如果refresh属性设|ؓ(f)trueQ不其他的属性是否符合条Ӟq部分被~存的内定w被更新Q这l编E者一U选择Q决定什么时候必d新?/p>
mode - 如果~程者不希望被缓存的内容增加到给用户的响应中Q可以设|mode属性ؓ(f)"silent"
其它可用的属性还包括Qcron 、groups、language、refreshpolicyclass、refreshpolicyparam?/p>
上面的这些属性可以单独用,也可以根据需要组合用,下面的例子将讲解q些常用属性的使用方式?/p>
1. 最单的cache标签用法
使用默认的关键字来标识cache内容Q超时时间是默认?600U?/p>
<cache:cache> <% //自己的JSP代码内容 %> </cache:cache> |
2. 用自己指定的字符串标识缓存内容,q且讑֮作用范围为session?/p>
<cache:cache key="foobar" scope="session"> <% //自己的JSP代码内容 %> </cache:cache> |
3.动态设定key|使用自己指定的time属性设定缓存内容的时旉Q用动态refresh值决定是否强制内容刷新?/p>
因ؓ(f)OSCache使用key值来标识~存内容Q用相同的key值将?x)被认?f)使用相同的的~存内容Q所以用动态的key值可以自qҎ(gu)不同的角艌Ӏ不同的要求军_使用不同的缓存内宏V?/p>
<cache:cache key="<%= product.getId() %>" time="1800" refresh="<%= needRefresh %>"> <% //自己的JSP代码内容 %> </cache:cache> |
4. 讄time属性ؓ(f)负数使缓存内Ҏ(gu)不过?/p>
<cache:cache time="-1"> <% //自己的JSP代码内容 %> |
5. 使用duration属性设|超期时?/p>
<cache:cache duration='PT5M'> <% //自己的JSP代码内容 %> |
6. 使用mode属性被缓存的内容不加入给客户的响应中
<cache:cache mode='silent'> <% //自己的JSP代码内容 %> |
在OSCachelg中提供了(jin)一个CacheFilter用于实现面U的~存Q主要用于对web应用中的某些动态页面进行缓存,其是那些需要生成pdf格式文g/报表、图片文件等的页面,不仅减少?jin)数据库的交互、减数据库服务器的压力Q而且对于减少web服务器的性能消耗有很显著的效果?/p>
q种功能的实现是通过在web.xml中进行配|来军_~存哪一个或者一l页面,而且q可以设|缓存的相关属性,q种Z配置文g的实现方式对于J2EE来说应该是一U标准的实现方式?jin)?/p>
[注] 只有客户讉K时返回http头信息中代码?00Q也是讉K已经成功Q的面信息才能够被~存
1. ~存单个文g
修改web.xmlQ增加如下内容,定?testContent.jsp面q行~存?/p>
<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行~存?/p>
<filter> <filter-name>CacheFilter</filter-name> <filter-class>com.opensymphony.oscache.web.filter.CacheFilter</filter-class> </filter> <filter-mapping> <filter-name>CacheFilter</filter-name> <!-Ҏ(gu)有jsp面内容q行~存--> <url-pattern>*.jsp</url-pattern> </filter-mapping> |
3. 自己讑֮~存属?/p>
在页面~存的情况下Q可以通过讄CacheFilter的初始属性来军_~存的一些特性:(x)time属性设|缓存的旉D,默认?600U,可以Ҏ(gu)自己的需要只有的讄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> <!-Ҏ(gu)有jsp面内容q行~存--> <url-pattern>*.jsp</url-pattern> </filter-mapping> |
pȝq_Qwindows 2000 高服务? P3 800 /512M内存
web服务器:(x)websphere 5.0
数据库服务器Qmysql 4.0.18-nt
性能试用工P(x)apache Jmeter
q次性能试Ҏ(gu)方ؓ(f)使用~存和不使用~存?sh)种Q他们的讉K代码都是一L(fng)Q通过数据源从本地mysql数据库中获取person表的所有记录,然后昄在页面上?/p>
试中将模仿10个用P每个用户发v5ơ请求,然后l计所有访问花费的旉?/p>
使用~存后的试l果 不用缓存时的测试结?/p>
所有请求花费的L?毫秒) 20569 22870
性能试的详l结果请大家查看下蝲内容中的《不使用cache时的pȝ性能试l果.txt》和《用cache后系l性能试l果.txt?/p>
在J2EEpȝ中,我们l常需要处理一些特D的动态内容,q些内容在一个时间段内的变更非常有限Q但是又不得不将他们定为动态内容进行输出,而且非常消耗数据库pȝ资源或者web服务器的资源Q这时我们就可以采用Cache----一U用于提高系l响应速度、改善系l运行性能的技?---来优化我们的pȝ。尤其是在Web应用中,q种处理可以很显著的改善pȝq行性能?/p>
本文中作者给大家介绍一个实现J2EE框架中Web应用层缓存功能的开放源代码目----OSCache。它提供?jin)在J2EEpȝ中实现缓存需要的丰富的功能。通过应用OSCacheQ我们不但可以实现通常的Cache功能、自q讑֮cache的相关特性比如缓存时间段/~存内容{,提升pȝ性能Q而且q能有效的改善系l的E_性。除此之外,OSCachelgq提供了(jin)更多的特性比如集、容错、灵zȝ~存区选择{?/p>
作者根据自q使用l验l大家提供了(jin)一些简单的例子Q他们部分演CZ(jin)如何使用OSCachelg提供的丰富特性,OSCache提供的特性远不止q些Q需要大家在今后的时间里深入的研I?/p>
NJava语言的性能Q就真的是远q不如C吗?
其实Q大安知道QJDK 5.0 6.0的绝Ҏ(gu)能和C相比差距q不大,在很多评里面,两者的差距不到一倍。而从语言Ҏ(gu)上来说QJava语言Q在抽象机制、安全机制、内存管理、ƈ发控制和基础库上Q和C语言相比Q就像火枪和弓箭?/p>
但是Q就是这P装备?jin)大量堪U完的高Ҏ(gu)的Java语言Q却在基应用领域内较?yu)应用,明显落后于C语言。尤其在数据库、高性能|络服务、图形图形处理等领域。这其中的根本原因是什么?Q?/p>
我想C(jin)一些原因:(x)
1、h的问题?/p>
能够用C语言写出优秀基础软g的h固然不多Q能用Java写出来的人恐怕更。Java有好几百万开发者,但是他们在干什么?大部分是L企业U开发、Web开发了(jin)Q像q种bt下蝲|站 www.bt285.cn 很简单就可以实现?jin)。但是有多少人真的理解Java的内存模型?有多h能够熟练使用java.util.concurrent包中提供的那些工P很多使用Java多年的h没有写过socketE序Q不?jin)解Java多线E的开销Q不清楚如何q行性能诊断和调优,而这些在写基软g的时候是必备的技能。大部分JavaE序员在刚刚学会(x)Java之后p{向Web开发,把主要精力花费在掌握一个又一个大型的、复杂的、具有厚厚的抽象层和华丽l构的frameworks上,不但对真实计机体系l构不清楚,对于Java虚拟出来的那个计环境也不清楚。因此,要把Java开发者编E{变成能够担负起下一代基软g开发工作的兵Q不但难度很大,而且必须p_的时间?/p>
2、风格的问题?/p>
q个问题我认为是最严重的。基软g开发崇的是自由、直接、透明、简单、高效,反对J琐华丽的设计,反对架床q屋的层层抽象,反对复杂的结构和不必要的灉|性。而Java开发者多q来形成的设?a >风格与此格格不入Q甚臛_以说是对立的。Java?a >意识形态上是要面向企业应用软g的开发,所以特别强调架构,设计模式Q强调标准,规规矩矩Q强调高姿态,一U华늚宫h(hun)气质。在C中,你需要什么就做什么。而在Java中,你经ؓ(f)?jin)要q某件事Q先new一个对象,然后以这个对象ؓ(f)参数new另一个对象,如此q般重复n遍,得到真正需要的对象Q最后就是ؓ(f)?jin)调用那个对象的一个方法?q套J琐的东西,对于基础软g开发来_(d)既不必要Q也很难?fn)惯。需要说明的是,q不是Java语言的问题,其实Java本n不必如此复杂、如此巴z克。从语言本n来看QJava也可以是d直接的,也可是酣畅淋漓的。只不过十多q来几乎没有L(fng)q,所以大家已l不知道Q该怎么用Java写简z程序?