ReportViewer内存泄漏问题解决方案[上]

摘要:
做这个项目有点倒霉。当它即将被接受时,我们在Microsoft ReportViewer控件中发现了一个错误,这导致我们的项目无法被正常接受。后来,我们检查了数据,发现ReportViewer确实存在内存泄漏。我们如何解决这个问题?也许因为ReportViewer非常方便,我仍然考虑使用ReportViewer来显示报告数据。这一次,不同的是ReportViewer PrecessingMode=Remote如何发布服务器报告以测试在新方案下测试页面上是否存在内存泄漏。在ReportService项目中,通过添加现有项添加到项目中。

做这个项目有点倒霉,快要验收的时候,发现微软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,用于输入参数。当然通过上面的url传参数的方式,访问报表时会默认将参数加载到toolbar中并刷新报表。

在参数后后面添加&rc:Toolbar=false可以隐toolbar,添加&rc:Parameters=Collapsed可以折叠toolbar。下图上方就是报表任务栏:

ReportViewer内存泄漏问题解决方案[上]第1张

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

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

免责声明:文章转载自《ReportViewer内存泄漏问题解决方案[上]》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Vue项目的全局环境设置手写Redux-Saga源码下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

学习 MFC之 工具栏(二)

对于InitToolBar()函数进行进一步解析: 1、首先声明一个全局对象:  CToolBar m_toolbar; 2、然后用create()创建toolbar: //创建ToolBar工具条 if(!m_toolbar.CreateEx(this,TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP...

C++ -- VLD(Visual LeakDetector)内存泄露库的使用

https://blog.csdn.net/xp178171640/article/details/80828530https://blog.csdn.net/xiaoyafang123/article/details/83655356 VLD简介 由于C/C++语言没有所谓的垃圾收集器,内存的分配和释放都需要程序员自己来控制,这会给C/C++程序员带来一...

Sketchup二次开发API之Toolbar类

Toolbar类用于创建Skethup快捷工具栏,基本用法格式如下。 toolbar = UI::Toolbar.new "Test"# This toolbar icon simply displays Hello World on the screencmd = UI::Command.new("Test") { UI.messagebox "Hell...

DevExpress中barManager下的toolbar如何在panel中显示

如题,我的Dev Toolbar需要在一个pannel中显示,并且居于最顶部。可是好像默认情况下toolbar都是在窗体的最顶部的,如何设置才能使其位于一个panel的最顶部呢? 解决方案:经过测试,发现只要更改barManager的form属性即可。不过有一点需要注意:  再设计状态下依然是位于最顶部。不过运行之后就可以看到变化了。 出处:https:/...

【Android】Anroid5.0+新控件---酷炫标题栏的简单学习

Android5.0+推出的新控件感觉特别酷,最近想模仿大神做个看图App出来,所以先把这些新控件用熟悉了。新控件的介绍、使用等等网上相应的文章已经特别多了,题主也没那能力去写篇详解出来,本篇随笔记录的主要是题主学习这些新控件时遇见的一些困惑以及在搞了半天后的一丝理解,或许也有新手也会碰到跟我一样的困惑,相互学习哈,如果有哪个地方理解错了,还望告知。 效...

EXTJS

1.什么是ExtJs?ExtJS可以用来开发RIA也即富客户端的AJAX应用,是一个用javascript写的,主要用于创建前端用户界面,是一个与后台技术无关的前端Ajax框架。因此,可以把ExtJS用在.Net、Java、Php等各种开发语言开发的应用中。ExtJS的前身来自于YUI,经过不断发展与改进,现在已经成为最完整与成熟的一套构建RIA Web应...