接触Richfaces时,我正在学习Dorado(上海锐道软件公司的Web表现层组件)控件,两者相比,Dorado是轻量级的,Richfaces是重量级的,比起Dorado,Richfaces更丰富、更强大、更灵活、更高知名度、更高质量、更具生命力、资源更多,而且还免费。
我毅然决定学习Richfaces,它的表现也让我肯定自己的正确选择。当我在实际项目中使用Richfaces时,发现我的项目运行起来很慢,比起PHP,简直是差远了,同样的记录数,如果使用PHP,页面响应速度是毫秒级的,使用Richfaces的响应速度却是秒级的。我不由得开始怀疑Richfaces的效率,在网络上搜寻相关问题时,很多人都有同样的感受,都觉得Richfaces比较慢,究其原因,有一种普遍的认识是Richfaces为了实现Ajax效果会下载很多js脚本本文件,会影响速度。的确,当做一个简单的Richfaces页面时,真正的数据可能才几十K,但是浏览器却下载了近1M的数据。在使用Firebug跟踪请求页面时,注意到Ajax脚本文件下载一次后再次使用时不会从服务器下载,而是直接来自Firefox缓存,这样的话页面响应速度并不会收到影响,那么到底是哪里出现了问题呢?
一次偶然,我用rich:dataTable标记时,在创建数据列表recordsList时,在循环中放置了System.out.println(),当进行页面操作时,控制台有大量输出,显示recordsList被重复创建,这些页面操作包括页面切换、通过a4j:commandLink或a4j:commandLink、或刷新a4j区域,也就是说,每当进行这些页面操作时,recordsList都会不停的创建,即每次都对数据库进行了读取,更让人惊讶的时,每次都将表中全部的记录读取出来,即便页面只显示了几条数据。看来问题就出在这里,至于Richfaces的效率问题不会是我们程序效率的关键因素。
下面我们做个实验,使用MySQL数据库,创建数据表Org,设置ID_、orgName、orgDesc三个字段,填充30万条记录,每页显示10条记录,共30012页我们分别使用三种创建数据表的方法对读取这张表的记录。
1 内存分页,managed-bean-scope=request
页面效果
中尤其慢。