问题定义
我遇到一个性能问题,在水晶报表上显示大量/巨大的数据结果集。报告大约需要4分钟或更长时间,具体取决于结果集大小。
如何在没有性能问题的情况下处理Crystal Reports中的大型结果集?
环境
Crystal Reports XI
Apache WebSvr 2.X
Jboss 4.2.3
Struts的
Java报告组件(JRC)
Crystal Report Viewer (CRV)
火狐
详情
我使用CRXI胖客户端构建我的报告(.rpt),然后在Jboss下的webapplication(webapp)中使用它。
用户指定过滤条件以生成报告(日期范围等)并将请求提交给webapp。 Webapp查询数据库,获得“结果集”。
我根据所有规范初始化JRC和CRV,最后调用Crystal Report Viewer的“processHttpRequest”方法在浏览器上显示报告。
所以.....
收到请求以生成包含过滤条件的报告
查询数据库以获取结果集
初始化JRC和CRV
最后通过调用
显示报告reportViewer.processHttpRequest(request,response,request.getSession()。getServletContext(),null);
性能问题是最后一步。我把日志放在各处,并注意到数据库查询不需要太长时间来返回结果集。一切都很快进行,直到我调用CRV的processHttpRequest。在浏览器上显示报告之前,此方法只会挂起很长时间。
当结果集较小时,CRV运行得非常快,但对于大型结果集,它需要很长时间。
我有子报表,并在报表上使用Crystal报表公式。其中一些也用于分组。但我不认为Subreports是真正的罪魁祸首。因为我有一些其他报告没有任何子报告,并且它们也很慢显示大型结果集。
方案吗
显然,我需要一个很好的解决方案来解决这个“如何在Crystal Reports中处理大型结果集?”的通用问题。
我想到了一些半生不熟的想法。
A)使用外部分页并仅为当前显示的页面获取数据。但为此,CRXI必须允许我创建自己的按钮(上一个,下一个,最后一个),这样我就可以控制click事件并相应地获取数据。我尝试通过注册CRV的事件处理程序“addToolbarCommandEventListener”来捕获事件。但是我的监听器在“afterHttpRequest”方法完成后被调用,这没有用。
我需要通过添加自己的上一页,下一页,最后一页按钮以及控制它的点击事件来控制UI。
B)让CRXI使用jquery类型的功能,以允许浏览器侧页导航。所以也许第一次显示报告需要5分钟,但一旦显示,用户就可以转到任何页面,而无需将请求发送回服务器。
C)尝试使用Crystal Reports 2008.我愿意使用这个版本,但我无法弄清楚它是否有任何可以帮助我的功能。
D)使用BIRT或JasperReports,因为它们显然能够处理大型数据集,通过在磁盘上缓存部分数据集等...
E)使用Crystal Reports Server如缓存服务器,应用程序服务器等以任何方式提供帮助吗?我在Crystal Page Viewer,Interactive Viewer,Part Viewer等上阅读了一些内容......但我不确定这些内容是否会解决这个问题。
如果有人能指出我正确的方向,我会很感激。