我有一個調用db2 z/os數據庫並在結果集中返回大約240mb數據的JAX-RS web服務。然後,我創建一個OutputStream,通過循環結果集併爲我的輸出添加一些XML標記來將此數據發送到客戶端。什麼是輸出大量數據的最快方式?
我很困惑要使用PrintWriter,BufferedWriter或OutputStreamWriter。我正在尋找提供數據的最快方式。我也不希望JVM持續保存這些數據,因此我不會使用它的內存。
任何幫助表示讚賞。
我有一個調用db2 z/os數據庫並在結果集中返回大約240mb數據的JAX-RS web服務。然後,我創建一個OutputStream,通過循環結果集併爲我的輸出添加一些XML標記來將此數據發送到客戶端。什麼是輸出大量數據的最快方式?
我很困惑要使用PrintWriter,BufferedWriter或OutputStreamWriter。我正在尋找提供數據的最快方式。我也不希望JVM持續保存這些數據,因此我不會使用它的內存。
任何幫助表示讚賞。
輸出最大速度將受到網絡帶寬的限制,我很確定任何Java OutputStream將比您會注意到的差別快得多。
選擇取決於要發送的數據:是文本(行)PrintWriter很容易,是一個字節數組採用OutputStream。
爲了在緩衝區中保存不太多的數據,您應該調用flush()任意x kb也許。
您應該使用
如果您發送的是較大的二進制數據,那麼您可能不想使用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