当前位置: 首页 > 编程日记 > 正文

从WEB SERVICE 上返回大数据量的DATASET

前段时间在做一个项目的时候,遇到了要通过WEB SERVICE从服务器上返回数据量比较大的DATASET,当然,除了显示在页面上以外,有可能还要用这些数据在客户端进行其它操作。查遍了网站的文章,问了一些朋友,也找了一些解决方法.
       
众所周知,如果不用其它方法,直接从WEB SERVICE上传回一个10W条记录的DATASET,可想而知的后果是什么,CPU要占用 100%,且要等上几分钟,这是任何一个项目都无法忍受的.在我上网找资料的过程中,试验了几种不同的方法,通过压缩SOAP改善XML Web service性能,这篇文章所介绍的方法用了SOAP扩展,是通过在WEB SERVICE端用已经过时了的NZIPLIB库来压缩SOAP响应,据称文本压缩率可达80%.文章里面的代码是VB.NET,费了好大劲翻译成C#,照上面建项目,但是很可惜,我没有编译成功,总是出错.
这里我找我建好的项目提供大家下载,大家有时间看看是什么问题.
SOAP压缩代码下载
      
而后,找到了用序列化的方式来减少网络传输量,Microsoft .NET Framework 1.x 中内建两种将物件序列化的 Formatter类别,SoapFormatter BinaryFormatter,两种方式均能减轻网络传输量提高性能,SoapFormatter方式传输的方式其实还是XML形式,加了很多XML标识,因此压缩率不是很理想,BinaryFormatter用纯二进制的方式序列化DATASET,能使压缩率大大提高,这是台湾作者李匡正 (台灣微軟應用架構技術經理提供的例子里对SQL范例库Northwind的测试结果: <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

SoapFormatter 

BinaryFormatter 

Dataset 序列化後 Bytes 數 

1,953,078

1,448,399 

很显示然BinaryFormatter 明显优于SoapFormatter ,而我也确实用了BinaryFormatter 这种方式实现了提高效率.
再者,用微软提供的DataSetSurrogate 类可以此基础上进一步压缩数据大小,DataSetSurrogate 在.net 2.0里自带。这是比较结果.

SoapFormatterBinaryFormatter
Dataset 序列化後Bytes數1,953,0781,448,399
DataSetSurrogate 序列化後Bytes數2,371,942575,684


在这里,有两种方式:可把序列化后的数据用文件形式保存在客户端硬盘;也可用Byte[]方式传回客户端,以下是代码。
web service 端(文件形式)
None.gif  [WebMethod(Description="循环获取远程DATASET")]
None.gif  
public void SurrogateReadTable(string TableName)
ExpandedBlockStart.gifContractedBlock.gif  
dot.gif{
InBlock.gif   
//把DataSet通过Surrogate Class 序列化成 Binary Stream
InBlock.gif
  
InBlock.gif   DataSet ds;
InBlock.gif   ds
=SqlHelper.ExecuteDataset(cnn,CommandType.Text,"select * from "+TableName);
InBlock.gif   
//实例化DataSetSurrogate,传取出的DATASET到构造函数里
InBlock.gif
   sds = new DataSetSurrogate(ds); 
InBlock.gif   
//实例化二进制流
InBlock.gif
   BinaryFormatter bf=new BinaryFormatter();
InBlock.gif   StreamWriter swDat; 
InBlock.gif   
//写到本地一个文件里
InBlock.gif
   swDat = new StreamWriter(@"c:\output_surrogate_dataset.dat");
InBlock.gif   bf.Serialize(swDat.BaseStream, sds);
InBlock.gif   
//这里可以知道序列化后的文件的大小
InBlock.gif
   long size = swDat.BaseStream.Length;
InBlock.gif   swDat.Close();
InBlock.gif  
ExpandedBlockEnd.gif  }

客户端
None.gifprivate void button1_Click(object sender, System.EventArgs e)
ExpandedBlockStart.gifContractedBlock.gif  
dot.gif{
InBlock.gif   label1.Text
=DateTime.Now.ToString();
InBlock.gif
InBlock.gif   button1.Enabled
=false;
InBlock.gif   
//反序列化Binary Stream能通过Surrogate Class转换成 DataSet
InBlock.gif
InBlock.gif   
//从WEB SERVICE上读取方法
InBlock.gif
   svs.SurrogateRead("t_busdocbase");
InBlock.gif   BinaryFormatter bf
=new BinaryFormatter();
InBlock.gif   StreamReader swDat; 
InBlock.gif   swDat 
= new StreamReader(@"c:\output_surrogate_dataset.dat");
InBlock.gif   
object o=bf.Deserialize(swDat.BaseStream);
InBlock.gif  DataSet ds;
InBlock.gif   sds 
= (DataSetSurrogate) o;
InBlock.gif   ds 
= sds.ConvertToDataSet();
InBlock.gif   dataGrid1.DataSource
=ds.Tables[0];
InBlock.gif   swDat.Close();
ExpandedBlockEnd.gif   }

None.gif
None.gif
None.gif

web service 端(Byte[]方式)

None.gif[WebMethod(Description="获取业务资料远程DATASET")]
None.gif      
public byte[] SurrogateRead1()
ExpandedBlockStart.gifContractedBlock.gif      
dot.gif{
InBlock.gif       DataSet ds;
InBlock.gif       ds
=SqlHelper.ExecuteDataset(cnn,CommandType.Text,"select * from t_busdocbase");
InBlock.gif       sds 
= new DataSetSurrogate(ds); 
InBlock.gif       MemoryStream s
= new MemoryStream();
InBlock.gif       BinaryFormatter bf 
= new BinaryFormatter();
InBlock.gif       bf.Serialize(s,sds);
InBlock.gif     
InBlock.gif       
byte[] e = s.ToArray();
InBlock.gif       
return e; 
InBlock.gif  
ExpandedBlockEnd.gif      }

None.gif


客户端   

None.gifprivate void button3_Click(object sender, System.EventArgs e)
ExpandedBlockStart.gifContractedBlock.gif   
dot.gif{
InBlock.gif    label1.Text
=DateTime.Now.ToString();
InBlock.gif
InBlock.gif    button3.Enabled
=false;
InBlock.gif    
//*反序列化Binary Stream能通过Surrogate Class转换成 DataSet*/
InBlock.gif
InBlock.gif    
//从WEB SERVICE上读取方法
InBlock.gif

InBlock.gif
InBlock.gif     
byte [] bb=svs.SurrogateRead1();
InBlock.gif     MemoryStream br
=new MemoryStream(bb);
InBlock.gif     BinaryFormatter bf
=new BinaryFormatter();
InBlock.gif     
object o=bf.Deserialize(br);
InBlock.gif     sds 
= (DataSetSurrogate) o;
InBlock.gif     ds 
= sds.ConvertToDataSet(); 
InBlock.gif     dataGrid1.DataSource
=ds.Tables[0];
InBlock.gif
InBlock.gif     br.Close();
InBlock.gif
ExpandedBlockEnd.gif    }

None.gif
None.gif
None.gif



我个人觉得用byte[]方式会安全些,毕竟不用在客户端产生文件,不用担心数据的安全。

当然作为从网络上读取数据来说,10W条是一个不小量,所有的方式包括压缩,序列化等都是权宜之计,而不是长久之计,在使用当中,我用以上的方法虽然能使网络传输量降低,且可在很短时间内就把数据显示在DATAGRID上,但CPU的开销却达到了100%,这是我一直头疼的。我后来又用了分页的方式,把10W条数据在服务器端就分批取出,每次500条,这样读取时间延长了,但CPU开销却未减轻很多,再后来,又用多线程的方式处理,不甚理想。因此最好的方法就是尽可能的不查询10W条数据,通过条件判断等方式减少所需处理的数据量。

本文从以下文章里借鉴:
http://www.dotnetjunkies.com/PrintContent.aspx?type=tutorial&id=46630AE2-1C79-4D5F-827E-6C2857FF1D23

http://blog.joycode.com/5drush/archive/2004/05/28/22990.aspx

http://www.chinacs.net/archives/11/2004/08/10/2155.html

http://www.microsoft.com/taiwan/msdn/columns/adonet/AdoNet_20041231.htm

http://www.microsoft.com/china/msdn/library/langtool/vcsharp/miszipcompression.mspx


转载于:https://www.cnblogs.com/flyskywlh/archive/2005/08/18/217382.html

相关文章:

ORACLE解决登陆em状态暂挂方法

1、找到oracle安装目录中db_1/计算机名_orcl/sysman/config/emd.properties &#xff0c; 用记事本打开emd.properties&#xff0c;在emd.properties文件 最后一行 的agentTZRegionGMT改为 agentTZRegionAsia/Chungking2、在dos 窗口输入 set oracle_sidorcl emctl stop dbcon…

VBA注释临时

Sub shishi() 按ABCDE为多选题定义答案; A&#xff0e;沙利度胺 B&#xff0e;异烟肼 C&#xff0e;利福平 d.氯法齐明 E.氨苯砜 46&#xff0e;各型麻风病的首选药物为(D) A&#xff0e;沙利度胺 B&#xff0e;异烟肼 C&#xff0e;利福平 d.氯法齐明 E.氨苯砜 45&#xf…

hung-yi lee_p13_反向传播

文章目录背景链式法则计算思路梯度计算过程/反向传播总结背景 回顾神经网络中计算梯度&#xff0c;更新梯度的过程 这里面的问题是&#xff0c;梯度是一个上百万维的向量&#xff0c;计算出来并非易事 这就引出了反向传播 可以说反向传播是梯度下降在神经网络中的实现。 链式…

介绍两个非常好用的Javascript内存泄漏检测工具

内存泄漏对开发者来说一般很难检测因为它们是由一些大量代码中的意外的错误引起的&#xff0c;但它在系统内存不足前并不影响程序的功能。这就是为什么会有人在很长时间的测试期中收集应用程序性能指标来测试性能。 最简单的检测内存泄漏的方式是用任务管理器检查内存使用情况。…

全局化和本地化

区域性En 英语en-CA 加拿大英语af-ZA 南非荷兰语eu 巴斯克语kn-IN 埃纳德语 印度tr 土耳其语Cy-uz-UZ 乌兹别克语 西里尔字母表Lt-uz-UZ 乌兹别克语 拉丁文字母表zh-CHT 繁体中文zh-CHS 简体中文设置当前区域性System.Threading.Thread.CurrentThread.CurrentCulture new Sys…

lvm讲解和磁盘故障案例

一&#xff1a;lvm讲解1.准备磁盘分区fdisk /deb/sdbn创建三个新分区&#xff0c;分别为1Gt改变分区类型为8e2.pvcreate /dev/sdb1yum install -y lvm [rootcentos7-1 ~]# yum install -y lvm 已加载插件&#xff1a;fastestmirror base …

hung-yi lee_p17_卷积神经网络

文章目录背景&#xff1a;卷积层池化层摊平KerasCNN学到了什么Deep DreamDeep Style怎么把CNN用在下围棋上为什么可以将CNN用于下围棋CNN更多应用背景&#xff1a; DNN拿掉一些参数就成CNN 为什么可以这样做 每一个神经元只需要图中的一部分就可以识别出想要的模式 更小的区域…

抓住青春的尾巴再愤青一把

这是今天google大神查到的&#xff1a;一、CAPCOM的《大神》&#xff0c;PS2专属ACT游戏&#xff0c;以三大神之一的日照处天子为原型&#xff0c;动作爽快华丽&#xff0c;是我期待很久的作品&#xff0c;预计今冬发售。 ... 并不是说这个水墨3D是大宇搞出来的DD&#xff0c;3…

the folder is already a source folder.

在新建的maven项目中&#xff0c;新建src/main/java时&#xff0c;提示the folder is already a source folder. 解决办法&#xff1a;右键工程&#xff0c;build path--configure build path--source&#xff0c;删除src/mian/java&#xff0c;再建src/main/java时即可。转载于…

selenium webdriver - 结束进程

1 import org.openqa.selenium.WebDriver;2 import org.openqa.selenium.firefox.FirefoxDriver;3 import org.openqa.selenium.os.WindowsUtils;4 /*5 * 结束进程6 */7 public class KillProcess {8 9 public static void main(String[] args) { 10 //结束进程 …

白盒测试的3中主要方法(cont.)

文章目录白盒测试简介逻辑覆盖测试法SCDCCCCDCMCCMCDC基本路径测试法BPC测试的四个步骤循环路径覆盖法白盒测试简介 静态白盒测试也称为结构化分析。 动态白盒测试又称为结构化测试。 以下所说的应该均属于动态白盒测试。 逻辑覆盖测试法 SC sentence coverage 语句覆盖 设…

CRichEdit小记

使用前要AfxInitRichEdit2(); 修改背景颜色和字体颜色 CRichEditCtrl* p(CRichEditCtrl*)GetDlgItem(IDC_RICHEDIT21);CHARFORMAT2 cf;memset((char*)&cf,0,sizeof(cf));COLORREF color;color RGB(0,255,0);cf.dwMask CFM_COLOR;cf.crTextColor color; //The text color…

学习3dmax(四)

今天没有怎么做东西&#xff0c;是再看一些理论的东西。这个是再网上看到的&#xff0c;虽然说的是如何学习3dmax&#xff0c;但是我个人认为学习任何一种技术都应该如此。1. 把MAX当成一门新的课程学习&#xff08;和MAYA没啥关系&#xff01;真的。&#xff09;&…

ES6深拷贝与浅拷贝

小感在前 React学习与开发过程要经历一个相当长的准备阶段&#xff0c;此前看阮一峰老师的文章中&#xff0c;他就特别提到这一点。但是&#xff0c;由于React框架或者说是一种优秀的前端架构实在太诱人&#xff0c;所以&#xff0c;掌握这项技术所涉及的技术栈过程中经历的任何…

hung-yi lee_p22_无监督学习:词嵌入

文章目录原视频地址&#xff1a;添加链接描述输入是一个词 输出是一个向量 整个过程无监督 用来训练的是一堆文章 精神&#xff1a; 根据一个词汇的上下文来理解它 具体&#xff1a; 1.count based 两个词经常一起出现&#xff0c;认为它们是相似的 2.prediction-based 给神经…

用vs2010打开使用vs2013升级后的WP工程

项目在win7vs2010的环境中建立的&#xff0c;后来在win8.1vs2013的环境下修改和完善&#xff1a; 但是所有功能实现后发现wp7项目在使用vs2013打开后因为单向升级的原因&#xff0c;项目只能被编译为wp8项目&#xff08;win8.1vs2013无法安装wp7的sdk&#xff0c;提示不兼容&am…

神州6号发射成功了--庆祝一下

转载于:https://www.cnblogs.com/ccBoy/archive/2005/10/12/253268.html

android保持服务不休眠(持续运行)以及唤醒屏幕的方法

假设有这样一个应用场景&#xff0c;一个服务一直在默默的工作&#xff08;比如即时地获取服务器的消息&#xff09;&#xff0c;即使在屏幕已经因为长时间无操作而关闭&#xff0c;或者用户按了电源键让屏幕关闭&#xff0c;手机进入休眠状态&#xff0c;他必须依然在工作中。…

三类常见软件质量(Quality Attribute)属性的通俗解释

外部质量 用户关心 正确性&#xff0c;最最基本的质量属性&#xff0c;对应功能需求&#xff0c;其他QA多对应非功能需求。健壮性&#xff0c;在异常情况下正常运行的能力。 包含容错能力和恢复能力。恢复没有容错健壮。可靠性&#xff0c;用平均无bug运行时间与平均bug修复时…

winform动态的文字效果

效果图如下 private void Form1_Load(object sender, EventArgs e){Graphics Car_Paint panel1.CreateGraphics();//实例化绘图对象string Car_Str "青岛**软件公司";//定义要绘制的动态文字Character character new Character();//实例化自定义类对象character.D…

使用Mycat构建MySQL读写分离、主从复制、主从高可用

数据库读写分离对于大型系统或者访问量很高的互联网应用来说&#xff0c;是必不可少的一个重要功能。 从数据库的角度来说&#xff0c;对于大多数应用来说&#xff0c;从集中到分布&#xff0c;最基本的一个需求不是数据存储的瓶颈&#xff0c;而是在于计算的瓶颈&#xff0c;…

SharePoint的Reporting Service Viewer Web Part

今天本来打算做一个专门用于Reporting Service报表浏览的SharePoint web part&#xff0c;记得在Reporting Service 2000下有一个viewer的Sample&#xff0c;就想找来参考一下&#xff0c;谁知在C:\Program Files\Microsoft SQL Server\90\Tools\Reporting Services\SharePoint…

7个面向对象常用原则的中英文名、别名、定义及显著特点

单一职责原则 英文名&#xff1a;Single Responsibility Principle(SRP) 别名&#xff1a;无 定义1&#xff1a;一个对象应该只包含单一的职责&#xff0c;并且该职责被完整地封装在一个类中 定义2&#xff1a;就一个类而言&#xff0c;应该仅有一个引起它变化的原因 开闭原则…

常见的“公共标志和说明”英文表达

1、Business Hours 营业时间  2、Office Hours 办公时间  3、Entrance 入口  4、Exit 出口  5、Push 推  6、Pull 拉  7、Shut 此路不通  8、On 打开 ( 放)  9、Off 关  10、Open 营业  11、Pause 暂停  12、Stop 关闭  13、Closed 下班  14、Menu 菜…

【T-SQL】基础——表别名

Som有时候我们需要为表设置别名&#xff0c;这样就可以方便的修改表。 如果在SSMS中&#xff0c;可以点击 Query-> SQL CMD mode --Set Alisa for the table:setvar tablename "[RetailDataWarehouse].[dbo].[FactUnit]" Select ExternalOrderId,COUNT(DISTINCT(R…

数据挖掘的实现流程

文章目录1.数据、信息与知识2.数据挖掘实现流程概览图3.数据准备(step 1)4.数据挖掘(step 2)5.模型的评估解释(step 3)6.知识运用(step 4)7.小结1.数据、信息与知识 2.数据挖掘实现流程概览图 这里提供两张图&#xff0c;以下讲解基于第一张图。 3.数据准备(step 1) Knowl…

设计模式:备忘录模式??

定 义&#xff1a;在不破坏封装性的前提下&#xff0c;捕获一个对象的内部状态&#xff0c;并在该对象之外保存这个状态。 这样以后就可以将该对象恢复到原先保存的状态。 结构图&#xff1a; Originator(发起人):负责创建一个备忘录&#xff08;Memento&#xff09;&#xff…

如何用Python批量提取PDF文本内容?

本文为你展示&#xff0c;如何用Python把许多PDF文件的文本内容批量提取出来&#xff0c;并且整理存储到数据框中&#xff0c;以便于后续的数据分析。 问题 最近&#xff0c;读者们在后台的留言&#xff0c;愈发五花八门了。 写了几篇关于自然语言处理的文章后&#xff0c;一种…

常用的3种注入方式

构造注入 指通过构造函数来传入具体类的对象设值注入(Setter注入) 指通过Setter方法来传入具体类的对象接口注入 指通过在接口中声明的业务方法传入具体类的对象

WebService客户端添加SOAPHeader信息

WebService客户端添加SOAPHeader信息 通过JAXBContext创建Marshaller对头信息进行解析为dom&#xff0c;获取WSBindingProvider&#xff0c;使用Headers.creat()创建soap的Header元素&#xff1b; 另外就是&#xff1a;将user转换为dom是为了不在有wsdl生成的LicenceInfo类中增…