什么是输出大量数据的最快方式?
我有一个调用db2 z/os数据库并在结果集中返回大约240mb数据的JAX-RS web服务。然后,我创建一个OutputStream,通过循环结果集并为我的输出添加一些XML标记来将此数据发送到客户端。什么是输出大量数据的最快方式?
我很困惑要使用PrintWriter,BufferedWriter或OutputStreamWriter。我正在寻找提供数据的最快方式。我也不希望JVM持续保存这些数据,因此我不会使用它的内存。
任何帮助表示赞赏。
输出最大速度将受到网络带宽的限制,我很确定任何Java OutputStream将比您会注意到的差别快得多。
选择取决于要发送的数据:是文本(行)PrintWriter很容易,是一个字节数组采用OutputStream。
为了在缓冲区中保存不太多的数据,您应该调用flush()任意x kb也许。
您应该使用
- 的BufferedWriter
- 呼叫.flush()经常
- 启用Gzip最佳压缩
- 开始思考关于这样做的不同的方式。你的数据可以分页吗?你需要一个请求中的所有数据吗?
如果您发送的是较大的二进制数据,那么您可能不想使用xml。当使用xml时,二进制数据通常用base64表示,它比原来的二进制大,并且使用相当多的CPU来转换为base64。
如果我是你,我会发送与XML分开的二进制文件。如果您使用WebService,MTOM附件可能会有所帮助。否则,您可以将引用发送到xml中的二进制数据,然后让应用程序。分别下载二进制数据。
至于发送二进制文件的最快方法,如果您使用的是weblogic,只需在响应的outputstram上写入就可以了。该输出流最有可能被缓冲,无论你做什么都可能不会改变性能。
打开gzip也可以帮助根据你发送的内容(例如,如果你发送jpeg(已经压缩的东西)或其他东西,它不会帮助很多,但如果你发送原始文本,那么它可以帮助很多等)。
我只发送纯文本XML – Tim 2011-03-08 20:52:44
@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 。
一个解决方案(这可能不是为你工作)是产卵的作业/线程创建一个文件,然后通知用户文件的时候就可以下载,这样你不依赖于带宽客户端的连接(你甚至可以适当压缩文件,客户端下载之前)
一些商业智能和数据运算的应用做到这一点,特别是如果这个过程需要一定的时间来产生数据。
大问题。 – Fortyrunner 2011-03-08 23:11:24