2012-07-09 87 views
0

我有以下問題:
我有一個Web應用程序,它將數據存儲在數據庫中。我希望客戶能夠提取數據,例如2個表格到一個文件(客戶端本地)。
數據庫可能是任意大的(這意味着我不知道有多少數據可能在數據庫中,可能是巨大的)。
這是最好的方法是什麼?
應該全部數據是SELECT編輯出來的表格並返回給客戶端作爲一個單一的結構存儲在一個文件?
或者應該部分檢索數據,例如:前100個,後100個入口等,並在客戶端創建單一結構?
這裏有沒有什麼優點可以考慮?如何將大量數據從數據庫返回給Web客戶端?

+0

什麼是客戶端將使用的數據? – SimonC 2012-07-09 11:33:26

+0

你可以這樣做,取決於用例。 – NimChimpsky 2012-07-09 11:34:16

+0

@SimonC:數據應該保存在本地文件中,並且用戶可以保存它們以供檢查等。 – Jim 2012-07-09 11:36:32

回答

0

我們有一個類似的用例與一個oracle cluster with約。 40GB的數據。最適合我們的解決方案是每條語句的最大數據量,因爲它顯着降低了DB開銷。

話雖這麼說,有三個優化其工作對我們非常好:

1)我們將數據劃分爲10大致相同大小的組和並行地從數據庫中選擇它們。對於我們的集羣,我們發現並行工作的8個連接約爲。比單個連接快8倍。有一些額外的加速可達12個連接,但這取決於你的數據庫和你的dba。

2.)遠離休眠或其他ORM,一旦談到大量數據,就使用定製的JDBC。使用所有可以達到的優化(例如ResultSet.setFetchSize())

3.)我們的數據壓縮得很好,並且通過gziper放置數據節省了大量的I/O時間。在我們的例子中,它消除了關鍵路徑上的I/O。順便說一下,將數據存儲在文件中也是如此。

+0

對於(3)在提交結果之前是否壓縮服務器端? – Jim 2012-07-09 13:09:41

+0

數據通過'OutputStream's傳輸,服務器使用'Buffered'和'GzipOutputStream'的組合(因此交易I/O的CPU週期) – Jonathan 2012-07-09 13:14:22

1

我已經構建了類似的東西 - 這裏有一些非常尷尬的問題,特別是當文件大小超出了您在瀏覽器中可以輕鬆處理的範圍時。隨着數據量的增長,生成文件的時間增加;這反過來又不是Web應用程序擅長的,因此即使只有少量訪問者請求大型文件,您也可能會面臨Web服務器不高興的風險。

我們所做的是將應用程序分成3部分。

「文件請求」是一個簡單的網頁,在該網頁中經過身份驗證的用戶可以請求他們的文件。這將在網頁請求的上下文之外啓動第二部分:

文件生成器。 在我們的例子中,這是一個windows服務,它在查看帶有文件請求的數據庫表,選擇最新的數據庫表,運行適當的SQL查詢,將輸出寫入CSV文件,並將該文件壓縮後,再將其移至輸出目錄並通過鏈接向用戶發送郵件。它在數據庫中設置記錄的狀態,以確保在任何時間點只有一個進程發生。

FTP/WebDAV站點: 將ZIP文件寫入可通過FTP和WebDAV訪問的文件夾 - 這些協議通常比使用標準HTTP下載的大型文件更好。

這很有效 - 用戶不喜歡等待他們的文件,但延遲很少超過幾分鐘。

相關問題