压缩数据,提升Web service性能

转载 2007年09月19日 15:35:00

项目中碰到一个问题,为客户做系统的另一家厂商居然用我们提供的Web service来初始化应用系统数据库,通过web service从源数据库中取一次取三百万行的表,处理后去填充另外一张表。调用接口的那哥们居然使用一个“select *"就想把所有数据都取过去,结果肯定是报内存溢出的错误。经过沟通后让他分批进行调用,但感觉效率还是不够高。在.net与java客户端自己暂时实在试验不出其它方法,所以决定使用压缩数据的方法。
.net与java交互的压缩方式较为简单的实现方式是用gzip格式,java本身有gzip的支持,.net没有相应的类库,我使用了开源项目sharpziplib来实现.net端的压缩功能。
经过试验,传输相同的字串,起码能够让长度减少三分之二,并且有效减低CPU的利用率。
代码如下:
1、C#端代码

 

public static string Compress(string uncompressedString)
        
{
            
byte[] byteData=System.Text.Encoding.UTF8.GetBytes(uncompressedString);
            MemoryStream ms
=new MemoryStream();
            Stream s
=new GZipOutputStream(ms);
            s.Write(byteData,
0,byteData.Length);
            s.Close();
            
byte[] compressData=(byte[])ms.ToArray();
            ms.Flush();
            ms.Close();
            
return System.Convert.ToBase64String(compressData,0,compressData.Length);
        }


        
public static string DeCompress(string compressedString)
        
{
//            string uncompressedString=string.Empty;
            StringBuilder sb=new StringBuilder(40960);
            
int totalLength=0;
            
byte[] byteInput=System.Convert.FromBase64String(compressedString);
            
byte[] writeData=new byte[4096];
            Stream s
=new GZipInputStream(new MemoryStream(byteInput));
            
while(true)
            
{
                
int size=s.Read(writeData,0,writeData.Length);
                
if(size>0)
                
{
                    totalLength
+=size;
                    sb.Append(System.Text.Encoding.UTF8.GetString(writeData,
0,size));
                }

                
else
                
{
                    
break;
                }

            }

            s.Flush();
            s.Close();
            
return sb.ToString();
        }

2、Java端代码
 public static String compress(String s) throws IOException{
        ByteArrayInputStream input 
= new ByteArrayInputStream(s.getBytes("UTF-8")); 
        ByteArrayOutputStream output 
= new ByteArrayOutputStream(1024);
        GZIPOutputStream gzout 
= new GZIPOutputStream(output); 

        
byte[] buf=new byte[1024];
        
int number; 

        
        
while ((number = input.read(buf)) != -1){ 
            gzout.write(buf,
0,number); 
        }
        
        gzout.close(); 
        input.close();
        
        String result 
=new BASE64Encoder().encode(output.toByteArray());
        
        output.close();
        
        
return result;
    }
    
    public static String decompress(String data) throws IOException{
        ByteArrayOutputStream output 
= new ByteArrayOutputStream(1024);
        ByteArrayInputStream input 
= new ByteArrayInputStream(new BASE64Decoder().decodeBuffer(data)); 
        GZIPInputStream gzinpt 
= new GZIPInputStream(input);
        
byte[] buf = new byte[1024];
        
int number = 0;
        
        
while((number = gzinpt.read(buf)) != -1){
            output.write(buf,
0,number);
        }
         
        gzinpt.close();
        input.close();
        
        String result 
= new String(output.toString("UTF-8"));
        
        output.close();
        
        
return result; 
        
    }

在web service服务器端加压,java客户端的调用解压,使用web service的性能得到了提升。
但觉得这样还是不能彻底的解决问题,下一步准备做的改进主要有两点,一是把服务器把返回的大数据量压缩成zip文件以attachment的格式返回给java客户端,另一个是在内部网络以tcp soap的方式进行调用,辅以多线程的技术,更有效地利用服务器的多CPU与并实现服务的分流,使web service不必依赖于IIS(当然啦,这些都需要WSE的支持)。 

相关文章推荐

Apache CXF实战之五 压缩Web Service数据

本文链接:http://blog.csdn.net/kongxx/article/details/7530216Apache CXF实战之一 Hello World Web ServiceApache...
  • kongxx
  • kongxx
  • 2012年05月03日 09:19
  • 13180

开发高性能的Web Service应用

  • 2011年03月23日 14:39
  • 221KB
  • 下载

Web Service性能测试工具Pylot

1、Pylot 到底是个什么工具   Pylot 是一款开源的用以测试 Web Service性能和扩展性的工具,它运行HTTP负载测试,这对于制定容量计划、确定基准点、分析系统瓶颈以及系统调优都非...

RESTful Web Service 的安全(token 认证方式)以及性能

可扩展性(scalability)和可用性(availability)  custom token authentication 使用一个独一无二的标志,来标示每一次的数据请求。 这个标志有两种...

C#使用Http Post方式传递Json数据字符串调用Web Service

引言   前段时间一直在做一个ERP系统,随着系统功能的完善,客户端(CS模式)变得越来越臃肿。现在想将业务逻辑层以下部分和界面层分离,使用Web Service来做。由于C#中通过直接添加引用...

android 客户端数据传递之一:Web Service 代码

http://sizeed.blog.163.com/blog/static/965254512011102143952442/ 此段代码是我这个项目调用Web Service的核心代码; ...

触发器+存储过程+程序集(CLR)+XML+Web service————实现数据同步

基础性质的数据,需要从A程序的A库同步到B程序的B库。第一种方法,肯定是写一个服务,让他自动同步。第二种方法,就是用触发器,这样,一个库的基础表数据的任何变动,都可以同步了。        ...

详解 Web service Axis2 JAVA调用.net接口 返回String的xml格式数据

import java.sql.Connection; import java.text.SimpleDateFormat; import java.util.Date; import javax....

采取web service传输超大数据(1)

采用web service传输超大数据   因为以前也没有做过相关的web service开发,对于Xfire也只是知道有这么一个框架。当然现在它已经变成apache基金会旗下的一个开源项目CXF。...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:压缩数据,提升Web service性能
举报原因:
原因补充:

(最多只允许输入30个字)