缓冲器:利用缓冲技术提高JSP程序的性能和稳定性

=a14c id=zoom>  、概述 在Web应用中有些报表生成可能需要数据库花很长时间才能计算出来;有网站WebSite提供天气信息它需要访问远程服务器进行SOAP才能得到温度信息所有这切都属于复杂信息例子在Web页面中加入过多复杂信息可能导致Web服务器、数据库服务器负荷过重JSP代码块缓冲为开发者带来了随意地增加各种复杂信息自由 JSP能够在标记库内封装和运行复杂Java代码它使得JSP页面文件更容易维护使得非专业开发人员使用JSP页面文件更加方便现在已经有许多标记库它们或者是商业产品或者是源代码开放产品但这些产品中大多数都只是用标记库形式实现原本可以用个简单Java Scriptlet实现功能很少有产品以某种创造性方式使用定制标记提供在出现JSP定制标记库的前几乎不可能实现使用方法 OSCache标记库由OpenSymphony设计它是种开创性JSP定制标记应用提供了在现有JSP页面的内实现快速内存缓冲功能虽然已经有些供应商在提供各种形式缓存Cache产品但是它们都属于面向特定供应商产品OSCache能够在任何JSP 1.1兼容服务器上运行它不仅能够为所有用户缓冲现有JSP代码块而且能够以用户为单位进行缓冲OSCache还包含些提高可伸缩性高级特性比如:缓冲到磁盘可编程缓冲刷新异常控制等等另外正如OpenSymphony其他产品OSCache代码也在个开放源代码许可协议的下免费发行 本文以个假想拍卖网站WebSite设计过程为例介绍OSCache工作过程这个假想Web网站WebSite将包含:个报告最近拍卖活动管理页面;个功能完整、带有各种宣传信息主页;个特殊导航条它包含了用户所有尚未成交拍卖活动信息 2、管理页面 拍卖网站WebSite包含个管理报表数据库服务器需要数秒时间才能创建这样个报表报表生成时间长这点很重要我们可能让多个管理员监视系统运行情况同时又想避免管理员每次访问时都重新生成这个报表为了实现这我们将把整个页面封装到个应用级缓冲标记的内这个缓冲标记每隔1小时刷新其他供应商提供些产品也具有类似功能只是OSCache比它们做得更好 为简单计我们将不过多地关注格式问题在编写管理页面时我们首先把标记库声明加入到页面: <%@ taglib uri="cachetags" prefix="cache" %> 接下来我们要用cache标记来包围整个页面cache标记默认缓冲时间是1小时 <cache:cache> .... 复杂管理报表 .... </cache:cache> 现在管理页面已经被缓冲如果管理员在页面生成后个小时的内再次访问同页面他看到将是以前缓存Cache页面不需要由数据库服务器再次生成这个报表   3、主页 拍卖网站WebSite主页显示网站WebSite活动情况宣传那些即将结束拍卖活动我们希望显示出正在进行拍卖活动数量当前登录用户数量在短期内就要结束拍卖活动清单以及当前时间这些信息有着区别时间精确度要求网站WebSite上拍卖活动通常持续数天因此我们可以把缓冲有效拍卖活动数量时间定为6个小时用户数量变化显然要频繁但这里我们将把这个数值每次缓冲15分钟最后我们希望页面中显示当前时间总是精确页面访问时间 在主页中声明标记库的后我们首先以不带缓冲方式直接输出当前日期: 现在是:<%= java.util.Date%> 接下来我们要显示个清单列出那些将在短期内结束拍卖活动: <cache:cache> <ul> <% // 构造个包含最近拍卖活动Iterator Iterator auctions = .... while (auctions.hasMore) { Auction auction = (Auction)auctions.next; %><li><%=auction%></li%< } %> </ul> </cache:cache> 最后我们希望显示出正在进行拍卖活动数量这个数字需要缓冲6小时由于cache标记需要是缓冲数据秒数我们把6小时转换成21600秒: <cache:cache time="21600"> <% //查询数据库得到拍卖活动总数 auctionCount = .... %> 本网站WebSite正在进行拍卖活动有<%=auctionCount%>个! </cache> 可以看到我们只用少量代码就构造出了个带有复杂缓冲系统主页这个缓冲系统对页面各个部分分别进行缓冲而且各个部分缓冲时间完全符合它们各自信息变化频繁程度由于有了缓冲现在我们可以在主页中放入更多内容;而在以前没有缓冲情况下主页中放入过多内容会导致页面访问速度变慢甚至可能给数据库服务器带来过重负载 4、导航条 假设在规划网站WebSite时候我们决定在左边导航条下方显示购物车内容我们将显示出用户所拍卖种商品出价次数和当前报价以及所有那些当前用户出价最高商品清单 我们利用会话级缓冲能力在导航条中构造上述功能把下面代码放入模板或者包含文件以便网站WebSite中其他页面引用这个导航条: <cache:cache key="navbar" scope="session" time="300"> <% //提取并显示当前出价信息 %> </cache:cache> 在这里我们引入了两个重要属性即key和scope在本文前面代码中由于cache标记能够自动为代码块创建唯key所以我们不需要手工设置这个key属性但在这里我们想要从网站WebSite其余部分引用这个被缓冲代码块因此我们显式定义了该cache标记key属性第 2scope属性用来告诉cache标记当前代码块必须以用户为单位缓冲而不是为所有用户缓冲 在使用会话级缓冲时应该非常小心应该清楚:虽然我们可以让复杂导航条减少5倍或10倍服务器负载但它将极大地增加每个会话所需要内存空间在CPU能力方面增加可能并发用户数量无疑很理想但是旦在内存支持能力方面让并发用户数量降低到了CPU限制的下这个方案就不再理想 正如本文前面所提到我们希望从网站WebSite其余部分引用这个缓冲代码块这是个用户增加了个供拍卖商品、或者出价竞购其他用户拍卖商品时我们希望刷新缓冲使得导航条下次被读取时具有最新内容虽然这些数据可能其他用户活动而改变但如果用户在网站WebSite上执行某个动作的后看到自己清单仍未改变他可能会感到非常困惑 OSCache库提供flush标记能够刷新缓冲内容我们可以把下面代码加入到处理用户动作且可能影响这区域页面的中: <cache:flush key="navbar" scope="session" /> 当用户下次访问它时navbar缓冲块将被刷新 至此为止我们这个举例网站WebSite构造工作已经完成且可以开始运行下面我们来看看OSCache异常处理能力即使缓冲内容已经作废比如在缓冲块内出现了Java异常OSCache标记库仍旧允许我们用编程思路方法显示这些内容有了这种异常控制功能我们可以拆除数据库服务器和Web服务器的间连接而网站WebSite仍能够继续运行JSP 1.2规范标准引入了TryCatchFinally接口这个接口允许标记本身检测和处理Java异常因此标记可以结合这种异常处理代码使得JSP页面更简单、更富有条理 OpenSymphony正在计划实现其他缓冲机制以及个可管理性更好主系统它将使我们能够对缓冲使用RAM和磁盘空间进行管理旦有了这些功能我们就能够进步提高网站WebSite响应速度和可靠性 【结束语】 OSCache能够帮助我们构造出更丰富多彩、具有更高性能网站WebSite有了OSCache标记库帮助现在我们能够用它解决些影响网站WebSite响应能力问题比如访问量高峰期、数据库服务器负荷过重等

Tags:  剩余动态缓冲不足 三重缓冲 缓冲区溢出 缓冲器

延伸阅读

最新评论

发表评论