如何使用Java处理Crystal Reports中的大型结果集?

时间:2010-09-10 00:10:33

标签: java crystal-reports crystal-reports-xi

问题定义

我遇到一个性能问题,在水晶报表上显示大量/巨大的数据结果集。报告大约需要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等上阅读了一些内容......但我不确定这些内容是否会解决这个问题。

如果有人能指出我正确的方向,我会很感激。

0 个答案:

没有答案