java

位置:IT落伍者 >> java >> 浏览文章

Java进阶:用缓沖技术提高JSP的性能和稳定


发布日期:2019年06月29日
 
Java进阶:用缓沖技术提高JSP的性能和稳定

概述

在Web应用中有些报表的生成可能需要数据库花很长时间才能计算出来有的网站提供天气信息它需要访问远程服务器进行SOAP调用才能得到温度信息所有这一切都属于复杂信息的例子在Web页面中加入过多的复杂信息可能导致Web服务器数据库服务器负荷过重JSP代码块缓沖为开发者带来了随意地增加各种复杂信息的自由

JSP能够在标记库内封装和运行复杂的Java代码它使得JSP页面文件更容易维护使得非专业开发人员使用JSP页面文件更加方便现在已经有许多标记库它们或者是商业产品或者是源代码开放产品但这些产品中的大多数都只是用标记库的形式实现原本可以用一个简单的Java Scriptlet实现的功能很少有产品以某种创造性的方式使用定制标记提供在出现JSP定制标记库之前几乎不可能实现的用法

OSCache标记库由OpenSymphony设计它是一种开创性的JSP定制标记应用提供了在现有JSP页面之内实现快速内存缓沖的功能虽然已经有一些供应商在提供各种形式的缓存产品但是它们都属于面向特定供应商的产品OSCache能够在任何JSP 兼容的服务器上运行它不仅能够为所有用户缓沖现有JSP代码块而且能够以用户为单位进行缓沖OSCache还包含一些提高可伸缩性的高级特性比如缓沖到磁盘可编程的缓沖刷新异常控制等等另外正如OpenSymphony的其他产品OSCache的代码也在一个开放源代码许可协议之下免费发行

本文以一个假想的拍卖网站设计过程为例介绍OSCache的工作过程这个假想的Web网站将包含一个报告最近拍卖活动的管理页面一个功能完整带有各种宣传信息的主页一个特殊的导航条它包含了用户所有尚未成交的拍卖活动信息

管理页面

拍卖网站包含一个管理报表数据库服务器需要数秒时间才能创建这样一个报表报表生成时间长这一点很重要因为我们可能让多个管理员监视系统运行情况同时又想避免管理员每次访问时都重新生成这个报表为了实现这一点我们将把整个页面封装到一个应用级的缓沖标记之内这个缓沖标记每隔小时刷新其他供应商提供的一些产品也具有类似的功能只是OSCache比它们做得更好

为简单计我们将不过多地关注格式问题在编写管理页面时我们首先把标记库声明加入到页面

<%@ taglib uri=cachetags prefix=cache %>

接下来我们要用cache标记来包围整个页面cache标记的默认缓沖时间是小时

<cache:cache> 复杂的管理报表 </cache:cache>

现在管理页面已经被缓沖如果管理员在页面生成后的一个小时之内再次访问同一页面他看到的将是以前缓存的页面不需要由数据库服务器再次生成这个报表

主页

拍卖网站的主页显示网站活动情况宣传那些即将结束的拍卖活动我们希望显示出正在进行的拍卖活动数量当前登录用户数量在短期内就要结束的拍卖活动的清单以及当前时间这些信息有着不同的时间精确度要求网站上的拍卖活动通常持续数天因此我们可以把缓沖有效拍卖活动数量的时间定为个小时用户数量的变化显然要频繁一些但这里我们将把这个数值每次缓沖分钟最后我们希望页面中显示的当前时间总是精确的页面访问时间

在主页中声明标记库之后我们首先以不带缓沖的方式直接输出当前日期

现在是<%=new javautilDate()%>

接下来我们要显示一个清单列出那些将在短期内结束的拍卖活动

<cache:cache> <ul> <% // 构造一个包含最近拍卖活动的Iterator Iterator auctions = while (auctionshasMore()) { Auction auction = (Auction)auctionsnext(); %><li><%=auction%></li%< } %> </ul> </cache:cache>

最后我们希望显示出正在进行的拍卖活动的数量这个数字需要缓沖小时由于cache标记需要的是缓沖数据的秒数我们把小时转换成

<cache:cache time=> <% //查询数据库得到拍卖活动总数 int auctionCount = %> 本网站正在进行的拍卖活动有<%=auctionCount%>个! </cache>

可以看到我们只用少量的代码就构造出了一个带有复杂缓沖系统的主页这个缓沖系统对页面各个部分分别进行缓沖而且各个部分的缓沖时间完全符合它们各自的信息变化频繁程度由于有了缓沖现在我们可以在主页中放入更多的内容而在以前没有缓沖的情况下主页中放入过多的内容会导致页面访问速度变慢甚至可能给数据库服务器带来过重的负载

导航条

假设在规划网站的时候我们决定在左边导航条的下方显示购物车内容我们将显示出用户所拍卖的每一种商品的出价次数和当前报价以及所有那些当前用户出价最高的商品的清单

我们利用会话级的缓沖能力在导航条中构造上述功能把下面的代码放入模板或者包含文件以便网站中的其他页面引用这个导航条

<cache:cache key=navbar scope=session time=> <% //提取并显示当前的出价信息 %> </cache:cache>

在这里我们引入了两个重要的属性即key和scope在本文前面的代码中由于cache标记能够自动为代码块创建唯一的key所以我们不需要手工设置这个key属性但在这里我们想要从网站的其余部分引用这个被缓沖的代码块因此我们显式定义了该cache标记的key属性第二scope属性用来告诉cache标记当前代码块必须以用户为单位缓沖而不是为所有用户缓沖一次

在使用会话级缓沖时应该非常小心应该清楚虽然我们可以让复杂的导航条减少倍或倍的服务器负载但它将极大地增加每个会话所需要的内存空间在CPU能力方面增加可能的并发用户数量无疑很理想但是一旦在内存支持能力方面让并发用户数量降低到了CPU的限制之下这个方案就不再理想

正如本文前面所提到的我们希望从网站的其余部分引用这个缓沖的代码块这是因为当一个用户增加了一个供拍卖的商品或者出价竞购其他用户拍卖的商品时我们希望刷新缓沖使得导航条下一次被读取时具有最新的内容虽然这些数据可能因为其他用户的活动而改变但如果用户在网站上执行某个动作之后看到自己的清单仍未改变他可能会感到非常困惑

OSCache库提供的flush标记能够刷新缓沖内容我们可以把下面的代码加入到处理用户动作且可能影响这一区域的页面之中

<cache:flush key=navbar scope=session />

当用户下次访问它时navbar缓沖块将被刷新

至此为止我们这个示例网站的构造工作已经完成且可以开始运行下面我们来看看OSCache的异常处理能力即使缓沖的内容已经作废比如在缓沖块内出现了Java异常OSCache标记库仍旧允许我们用编程的方法显示这些内容有了这种异常控制功能我们可以拆除数据库服务器和Web服务器之间的连接而网站仍能够继续运行JSP 规范引入了TryCatchFinally接口这个接口允许标记本身检测和处理Java异常因此标记可以结合这种异常处理代码使得JSP页面更简单更富有条理

OpenSymphony正在计划实现其他的缓沖机制以及一个可管理性更好的主系统它将使我们能够对缓沖使用的RAM和磁盘空间进行管理一旦有了这些功能我们就能够进一步提高网站的响应速度和可靠性

【结束语】

OSCache能够帮助我们构造出更丰富多彩具有更高性能的网站有了OSCache标记库的帮助现在我们能够用它解决一些影响网站响应能力的问题比如访问量高峰期数据库服务器负荷过重等

上一篇:在JSP中使用JavaMail[2]

下一篇:Java/JSP中调用SQL Server存储过程完整示例