=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属性
第 2
scope属性用来告诉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响应能力
问题
比如访问量高峰期、数据库服务器负荷过重等
延伸阅读
最新评论