繁体   English   中英

输出大量数据的最快方法是什么?

[英]What is the fastest way to output a large amount of data?

我有一个JAX-RS Web服务,该服务调用db2 z / os数据库并在结果集中返回大约240mb的数据。 然后,我将通过遍历结果集并为输出添加一些XML标记来创建一个OutputStream,以将该数据发送到客户端。

我对使用PrintWriter,BufferedWriter或OutputStreamWriter感到困惑。 我正在寻找最快的方式来传递数据。 我也不希望JVM保留此数据的时间超出其需要的时间,因此我不消耗其内存。

任何帮助表示赞赏。

你应该用

  1. 但是BufferedWriter
  2. 经常调用.flush()
  3. 启用gzip以获得最佳压缩
  4. 开始考虑另一种方法。 可以对数据进行分页吗? 您是否在一个请求中需要所有数据。

如果要发送大型二进制数据,则可能不想使用xml。 当使用xml时,二进制数据通常使用base64表示,它变得比原始二进制文件大,并且要转换为base64使用大量的CPU。

如果您是我,则将二进制文件与xml分开发送。 如果您使用的是WebService,MTOM附件可能会有所帮助。 否则,您可以在xml中发送对二进制数据的引用,然后让该应用程序运行。 分别下载二进制数据。

至于发送二进制文件的最快方法,如果您使用的是weblogic,则只需写响应的outputstram即可。 该输出流很可能已被缓冲,无论您做什么都可能不会改变性能。

根据您发送的内容(例如,如果您发送的是jpeg(已压缩的内容))或其他内容,启用gzip可能也会有所帮助,但是如果您发送的是原始文本,则可以提供很多帮助,等等。)。

一种解决方案(可能不适合您)是生成一个创建文件的作业/线程,然后在文件准备好下载时通知用户,这样您就不必受限于客户端连接的带宽了(而且您甚至可以在客户端下载文件之前正确压缩文件)

某些Business Intelligence和数据处理应用程序可以执行此操作,特别是如果该过程需要一些时间来生成数据时。

输出最大速度将受到网络带宽的限制,并且我确定任何Java OutputStream的运行速度都将比您注意到的差异快得多。

选择取决于要发送的数据:是文本(行)PrintWriter很容易,是一个字节数组作为OutputStream。

要在缓冲区中保存太多数据,您应该调用flush()任何x kb。

您永远不要使用PrintWriter通过网络输出数据。 首先,它创建依赖于平台的换行符。 其次,它静默捕获所有I / O异常,这使您很难处理这些异常。

而且,如果您要发送240 MB的XML格式,那么您肯定做错了。 在开始担心要使用哪个流类之前,请尝试减少数据量。

编辑:

关于PrintWriter(和PrintStream)的建议来自Elliotte Rusty Harold的书。 我不记得是哪一个,但那是几年前的事了。 我认为那本书写完后就把ServletResponse.getWriter()添加到API了-因此看起来Sun并没有遵循Rusty的建议。 我仍然认为这是个好建议-出于上述原因,并且因为它可能会诱使实现作者违反API合同以获得可预测的行为。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM