我有一个JAX-RS Web服务,它调用db2 z / os数据库并在结果集中返回大约240mb的数据。然后我创建一个OutputStream,通过循环结果集并为我的输出添加一些XML标记将这些数据发送到客户端。
我对使用PrintWriter,BufferedWriter或OutputStreamWriter的内容感到困惑。我正在寻找提供数据的最快方式。我也不希望JVM持有这个数据的时间超过它需要的时间,因此我不会耗尽它的内存。
感谢任何帮助。
答案 0 :(得分:1)
你应该使用
答案 1 :(得分:1)
如果要发送大型二进制数据,则可能不希望使用xml。当使用xml时,二进制数据通常使用base64表示,它比原始二进制文件大,并且使用了相当多的CPU来转换为base64。
如果我是你,我会将二进制文件与xml分开发送。如果您使用的是WebService,MTOM附件可能有所帮助。否则你可以发送对xml中二进制数据的引用,并让app。分别下载二进制数据。
至于发送二进制文件的最快方法,如果你使用的是weblogic,只需在响应的outputstram上写一下就行了。该输出流很可能是缓冲的,无论你做什么都可能不会改变性能。
打开gzip也可能有所帮助取决于你发送的内容(例如,如果你发送jpeg(已经压缩的东西)或其他东西,它将没有多大帮助,但如果你发送原始文本,那么它可以帮助很多,等等。)。
答案 2 :(得分:1)
一个解决方案(可能对您不起作用)是生成一个创建文件的作业/线程,然后在文件准备下载时通知用户,这样你就不会受到带宽的影响。客户端连接(您甚至可以在客户端下载之前正确压缩文件)
某些商业智能和数据处理应用程序会执行此操作,特别是如果该过程需要一些时间来生成数据。
答案 3 :(得分:0)
输出最大速度将受到网络带宽的限制,我确信任何Java OutputStream都会比你注意到差异要快得多。
选择取决于要发送的数据:是文本(行)PrintWriter很容易,是一个字节数组采用OutputStream。
要在缓冲区中保存不太多的数据,您应该调用flush()任何x kb。
答案 4 :(得分:0)
您永远不应该使用PrintWriter通过网络输出数据。首先,它创建了与平台相关的换行符。其次,它会默默地捕获所有I / O异常,这使您很难处理这些异常。
如果您发送240 MB作为XML,那么您肯定做错了什么。在开始担心要使用哪个流类之前,请尝试减少数据量。
编辑:
关于PrintWriter(和PrintStream)的建议来自Elliotte Rusty Harold的书。我不记得哪一个,但几年前。我认为ServletResponse.getWriter()在编写完本书后被添加到API中 - 所以看起来Sun并没有遵循Rusty的建议。我仍然认为这是一个很好的建议 - 出于上述原因,并且因为它可以诱使实施作者violate the API contract 为了获得可预测的行为。