2011-03-08 71 views
1

我有一個調用db2 z/os數據庫並在結果集中返回大約240mb數據的JAX-RS web服務。然後,我創建一個OutputStream,通過循環結果集併爲我的輸出添加一些XML標記來將此數據發送到客戶端。什麼是輸出大量數據的最快方式?

我很困惑要使用PrintWriter,BufferedWriter或OutputStreamWriter。我正在尋找提供數據的最快方式。我也不希望JVM持續保存這些數據,因此我不會使用它的內存。

任何幫助表示讚賞。

+0

大問題。 – Fortyrunner 2011-03-08 23:11:24

回答

0

輸出最大速度將受到網絡帶寬的限制,我很確定任何Java OutputStream將比您會注意到的差別快得多。

選擇取決於要發送的數據:是文本(行)PrintWriter很容易,是一個字節數組採用OutputStream。

爲了在緩衝區中保存不太多的數據,您應該調用flush()任意x kb也許。

1

您應該使用

  1. 的BufferedWriter
  2. 呼叫.flush()經常
  3. 啓用Gzip最佳壓縮
  4. 開始思考關於這樣做的不同的方式。你的數據可以分頁嗎?你需要一個請求中的所有數據嗎?
1

如果您發送的是較大的二進制數據,那麼您可能不想使用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

0

您不應該使用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

1

一個解決方案(這可能不是爲你工作)是產卵的作業/線程創建一個文件,然後通知用戶文件的時候就可以下載,這樣你不依賴於帶寬客戶端的連接(你甚至可以適當壓縮文件,客戶端下載之前)

一些商業智能和數據運算的應用做到這一點,特別是如果這個過程需要一定的時間來產生數據。

相關問題