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