2012-04-17 72 views
4

我目前正在爲我們的客戶端開發一些Web服務。在我們提供給他們之前,我們希望優化數據庫調用的性能,因爲可能會返回大量的數據。 (可能是數以萬計的對象,可能是數百萬,每個對象包含大約12個其他對象的列表)從ASP.net Web服務返回大量數據時有什麼好的做法?

我們不想讓我們的服務器緊張,也不想讓Web服務不必要地受到限制。

一個Web服務方法返回指定日期範圍內的所有數據,我在想,如果要返回的數據量超過設定量較大,回一條消息說是這樣的:

「數據太大,請縮小日期範圍「

是否限制了用戶的範圍?

我必須限制客戶可以一次檢索的數據量,但仍然儘可能方便地保存。我的意思是,他們也是程序員,所以它不必太簡單,但很簡單,可以使用。

有關通過Web服務返回大量數據的一些良好實踐?

謝謝!

+0

數以萬計的究竟是什麼?千兆字節,字符串,布爾值?你肯定使用.NET與MySql? – Widor 2012-04-17 15:53:36

+0

對不起,我應該澄清。成千上萬的對象,每個對象都包含來自12個不同表格的記錄列表。很難確切地說出什麼類型的數據類型,主要是字符串。 – PaulG 2012-04-17 15:55:49

+0

我希望該服務返回一個具有isSuccessful布爾值和錯誤代碼(或文本)的Response對象。消費者可以檢查事務的成功(這是一個詞),並打開錯誤代碼以確定下一步該做什麼。我不建議限制返回的記錄,因爲這將基於數據集,而是做一些像日期範圍一樣的事情,所以他們知道他們總是會得到結果。 – 2012-04-17 16:01:10

回答

4

你也許能夠適應在列表中顯示的頁面數據的常用技術或格。對數據庫的調用指定要返回的記錄數和頁碼。

因此,例如,如果他們在頁面上顯示10條記錄,則只會返回10條記錄進行顯示。記錄1 - 10(或0 - 9,如果您願意)返回頁面1,11 - 20返回頁面2,依此類推。

經常返回的還有可用的記錄總數。

這樣,用戶可以繼續滾動瀏覽大量記錄,或者他們可以選擇優化其搜索條件以產生更小的結果集。

你可以考慮這種分頁或組塊方法爲您的Web服務。 Web服務調用提供每個塊中要發送的記錄數,以及「頁面」或「塊」編號。 Web服務將返回所需的記錄以及可用記錄的總數。

使用這種方法,使用Web服務的開發人員仍然處於控制之中。

調用代碼可以放在一個循環中,以便它繼續請求塊,如果這種行爲是可取的。如果有人真的想要一整套記錄,他們可以將記錄參數數量設置爲非常大的數字(或者可以將該參數設置爲可選參數,如果爲空,零,空值則返回所有內容)。

0

您可以每次給他們一大塊數據,例如(1000 obj)他們必須指定一個開始索引和他們想要的數據量,然後用它來獲取數據。 在SQL中有TAKE和Skip可以很容易地完成這項工作。

2

這確實取決於您的需求。這看起來更像是一個設計問題,而不是一個編碼問題,但在我們的系統中,我們有兩種方法。我會分享他們給你一些想法來考慮。

  • 在第一個,我們是提供數據的人。我們允許客戶下載他們賬戶的交易數據,而對於一些客戶來說,這可能是相當大的數據量。我們將它們限制爲X天的數據,並且這些數據沒有問題。

  • 在第二個中,我們正在使用來自已建立供應商的Web服務中的數據,該服務跟蹤車輛位置數據以及調度員和管理層感興趣的其他數據。在我們的車隊每輛貨車給出了它們的地理位置的定期更新,以及其他數據(上破加載/卸載/驅動器等)

    • 在這些網絡服務,我們要求的日期範圍,服務返回一組限制的記錄(每次通話1000條記錄)。
    • 除了傳入日期範圍外,我們還傳入一個「位置」整數字段。在第一次通話時,「位置」設置爲零。
    • Web服務返回「更多數據存在」布爾型字段。
    • 如果「更多數據存在」= true,那麼我們再次調用web服務,並增加「position」參數,直到「更多數據存在」= false(這是我們代碼中的一個簡單的while循環)

我認爲第一個對程序員或最終用戶來說都很好。第二種與程序員打交道時效果很好。

+0

感謝您的回覆。我喜歡你提到的第二種方法。但是,如果它只是在客戶端循環播放,它真的能減少我們服務器上的壓力嗎? – PaulG 2012-04-17 19:54:00

+0

這不是,除了當我的程序解析retreived數據時有一個短暫的暫停,並且在它進入下一批之前。這釋放了服務器的其他調用來進入中間呼叫。 – David 2012-04-17 20:02:15

相關問題