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

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

问题描述:

我有一个调用db2 z/os数据库并在结果集中返回大约240mb数据的JAX-RS web服务。然后,我创建一个OutputStream,通过循环结果集并为我的输出添加一些XML标记来将此数据发送到客户端。什么是输出大量数据的最快方式?

我很困惑要使用PrintWriter,BufferedWriter或OutputStreamWriter。我正在寻找提供数据的最快方式。我也不希望JVM持续保存这些数据,因此我不会使用它的内存。

任何帮助表示赞赏。

+0

大问题。 – Fortyrunner 2011-03-08 23:11:24

输出最大速度将受到网络带宽的限制,我很确定任何Java OutputStream将比您会注意到的差别快得多。

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

为了在缓冲区中保存不太多的数据,您应该调用flush()任意x kb也许。

您应该使用

  1. 的BufferedWriter
  2. 呼叫.flush()经常
  3. 启用Gzip最佳压缩
  4. 开始思考关于这样做的不同的方式。你的数据可以分页吗?你需要一个请求中的所有数据吗?

如果您发送的是较大的二进制数据,那么您可能不想使用xml。当使用xml时,二进制数据通常用base64表示,它比原来的二进制大,并且使用相当多的CPU来转换为base64。

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

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

打开gzip也可以帮助根据你发送的内容(例如,如果你发送jpeg(已经压缩的东西)或其他东西,它不会帮助很多,但如果你发送原始文本,那么它可以帮助很多等)。

+0

我只发送纯文本XML – Tim 2011-03-08 20:52:44

+0

@Pete:我明白了。我认为在这种情况下开启gzip可能会有所帮助。 – 2011-03-08 23:38:57

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

如果你发送240 MB作为XML,那么你肯定是做错了什么。在开始担心要使用哪个流类之前,请尝试减少数据量。

编辑:

大约为PrintWriter(和PrintStream的)建议从一本书Elliotte Rusty Harold来了。我不记得哪一个,但是几年前。我认为ServletResponse.getWriter()加入到API那本书是写后 - 所以它看起来像太阳没有按照生锈的建议。我仍然认为这是很好的建议 - 对于上述原因,因为它可以以获得可预测的行为诱使实现创作者violate the API contract

+2

有趣的是,你有任何关于不使用PrintWriter网络的参考?我所有的servlet都从ServletResponse.getWriter()写入PrintWriter。 – PeterMmm 2011-03-08 16:16:39

+0

我不认为240MB的XML对于每个月会被调用一次的服务来说太多了。 – Tim 2011-03-08 20:55:06

+0

@PeterMmm:很好,看看我上面的修改。 @Pete:如果它不是太多,你为什么要优化它?我只是指出可能有更好的优化目标。 – 2011-03-08 22:41:21

一个解决方案(这可能不是为你工作)是产卵的作业/线程创建一个文件,然后通知用户文件的时候就可以下载,这样你不依赖于带宽客户端的连接(你甚至可以适当压缩文件,客户端下载之前)

一些商业智能和数据运算的应用做到这一点,特别是如果这个过程需要一定的时间来产生数据。