压缩数据,提升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的支持)。 

提高 Web Service 数据传输效率的基本方法

背景 Web Service 现如今已经成为 SOA 实现标准之一。很多公司已经或者正在参与到 Web Service 项目的实现和部署中。Web Service 的优点在于松散的处理异构系统之...
  • shdhenghao3
  • shdhenghao3
  • 2016年03月28日 09:51
  • 1540

前端优化:九个技巧,提高Web性能

当今数字世界,存在着无数的网站,每天都需要处理各种不同的原因的访问。然而,这些网站中有很大一部分显得笨重,使用起来也很麻烦。没怎么优化的网站会被各种各样的问题困扰,包括加载时间、不支持移动设备、浏览器...
  • VermouthDream
  • VermouthDream
  • 2017年02月11日 21:37
  • 1525

Java Web项目如何提高访问效率

通常大型应用项目的效率瓶颈一般都是在数据库总结几点数据库效率优化方面应该注意的问题1、 避免使用Hibernate框架   用Hibernate一次性进行5万条左右数据的插入,若ID使用sequenc...
  • a236209186
  • a236209186
  • 2016年05月09日 09:09
  • 583

关于 Java Web 项目性能提升的一些思路

关于 Java Web 项目性能提升的一些看法,欢迎大侠们进来提供更多建议,也欢迎拍砖。...
  • defonds
  • defonds
  • 2013年12月13日 17:01
  • 6034

Web API性能优化(一)压缩

简单的应用场景:分页获取日志JSON信息。 很简单的实现,简单的记录一下 未压缩时候 使用PostMan请求http://localhost:34390/api/gpm/syslog/pag...
  • rh57b1f7
  • rh57b1f7
  • 2017年02月08日 14:31
  • 194

实验楼sql进阶之简化数据操作提升性能(window)

背景成绩管理系统中,当有同学的分数被修改时,需要通过触发器将成绩表中的这条更新记录存到新的表 modifymark 中。同时需要创建一个存储过程用来显示数学课的全部学生的成绩,并按分数降序排列。另外,...
  • u013716535
  • u013716535
  • 2017年11月07日 21:05
  • 110

Web测试需要了解的知识

这里只是介绍Web测试相对于其他类型软件的测试额外需要了解的内容,关于测试方法不是本文的重点,里面谈到的每一项在以后的文章中再说明。大家看到这些内容可能都不陌生,我晒出的内容也许不对或有误导,请大家指...
  • zzzmmmkkk
  • zzzmmmkkk
  • 2013年06月02日 13:18
  • 1647

如何提高数据库访问性能

特别说明: 1、  本文只是面对数据库应用开发的程序员,不适合专业DBA,DBA在数据库性能优化方面需要了解更多的知识; 2、  本文许多示例及概念是基于Oracle数据库描述,对于其它关...
  • u010327174
  • u010327174
  • 2014年10月16日 16:35
  • 1763

WebService工作原理 与 性能测试结论

用更简单的方式给大家谈谈WebService,让你更快更容易理解,希望对初学者有所帮助。 WebService是基于网络的、分布式的模块化组件。   我们直接来看WebService的一个简易工...
  • m1654399928
  • m1654399928
  • 2017年01月03日 19:56
  • 959

提升Java性能的基本方法

Java从诞生之日起就被质疑:字节码在JVM中运行是否会比机器码直接运行的效率会 低很多?很多技术高手、权威网站都有类似的测试和争论,从而来表明Java比C (或C++) 更快或效率相同。此类话题我们...
  • lexang1
  • lexang1
  • 2015年11月18日 23:52
  • 726
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:压缩数据,提升Web service性能
举报原因:
原因补充:

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