首页 > 代码库 > ReportViewer内存泄漏问题解决方案

ReportViewer内存泄漏问题解决方案

  做这个项目有点倒霉,快要验收的时候,发现微软ReportViewer控件的一个bug,导致我们的项目无法正常验收。

  问题描叙:用ReportViewer本地模式做的报表,在ASP.NET页面中呈现。在asp.net服务端有一个静态页面,用户轮播报表页面。这些页面被加载到一个盒子里面,然后在电视上面显示。最终电视就可以看到我们报表轮回的切换。在推广的过程中,电视终端越来越多,暴露出一个问题,报表播放久了就会出现内存溢出的问题。

  后来查资料,显示ReportViewer确实存在内存泄漏的问题,该如何解决这个问题呢?

  第一个解决方法:重启iis的应用程序域,对报表站点使用的应用程序域设置内存超过xGB的时候,回收一次内存。

  方案缺陷:在资源回收那一刻访问报表的时候会访问不成功,原因是无法正常访问session。

  补救措施:(1)将session存储到StateServer中(2)将session存储在数据库中  这两种方案经过测试都不行。

  

  遗憾的是我们的报表需要在带上轮播,资源回收那一刻这个问题就暴露出来了,而且随着电视终端增加频率越来越高,显然这中方案无法满足现有的需求。

 

  第二个解决方法: 换报表控件。

  首先花了两天的时间研究html报表,发现目前没有一款html报表的图标类型有ReportService丰富,最后还是选择使用ReportService来做。

  可能由于ReportViewer确实很方便,我还是考虑使用ReportViewer来展现报表数据,这次不同的是ReportViewer.PrcessingMode=Remote。经过测试这个中方法应用程序服务器依然存在内存泄漏的问题。

  接着就想到直接访问Report Server的方式来解决问题。

  1. 服务端报表如何发布
  2. 新的方案下做测试页面测试是否存在内存泄漏的问题。(应用程序服务器端和前端)
  3. 本地RDLC报表是否能直接copy到服务端使用
  4. ReportServer匿名校验

  报表服务端发布:

  (1)在 开始 ->Microsoft SQL Server 2008 R2 ->配置工具 下Reporting Services 配置管理器可以配置报表服务器。

  (2)通过SQL Server Business Intelligence Development Studio,右键“部署”就能部署到报表服务器上面。

  (3)报表服务开启后,默认情况下可以通过http://localhost:80/reports来管理发布到报表服务器上的文件,如果重现部署,可先在这里删除已部署的报表文件。

  (4)通过http://localhost/reportserver可以访问报表服务器上的所有的报表。

 

  测试是否存在内存泄漏的问题:

  这一点我已经做了,测试结果是报表服务器和应用程序服务器和浏览器端都没有内存泄漏的问题。源码比较麻烦,就不贴了。

 

  

  本地RDLC报表是否能直接copy到服务端使用:

  (1)直接将RDLC文件的后缀名修改成RDL。

  (2)在ReportService项目中通过“添加现有项”添加到项目中。

  (3)修改数据源的连接字符串和数据集的查询字符串

  (4)在访问报表url后面添加&parameter1=aa&parameter2=bb的方式可以为报表中的url赋值。

  (5)对于有参数的报表页面,默认情况下会出现toolbar.如下图所示:&rc:Toolbar=false可以隐toolbar。

&rc:Parameters=Collapsed可以受挫toolbar。

详细参见:  http://technet.microsoft.com/en-us/sqlserver/ms152835(v=sql.105)

 

下周研究如何实现匿名访问报表服务器的问题。