2009-07-08 52 views
3

我有一個.NET 2.0 Web應用程序,它只被用作客戶端應用程序的後端,客戶端應用程序將向它發送一個包含1-500KB數據的請求,服務器將對該數據做一些處理,然後查詢數據庫以構建一組數據以返回客戶端 - 從200KB到200MB的任何數據。數據可能需要長達15分鐘的時間才能從數據庫完全加載,並且長達一小時即可完全傳輸到客戶端(儘管通常時間會比較低 - 20s查詢,10s傳輸)。但是,對於數據庫查詢和客戶端的某些組合,有時數據庫速度更快,有時與客戶端的鏈接速度更快。尋找.Net磁盤緩衝流

客戶端通過不同質量的鏈路進行連接 - 一些通過10MB LAN,一些通過共享64kbps ISDN鏈路。我有四件事情要確保:

  1. 數據庫連接必須在儘可能短的時間內保持打開狀態。
  2. 必須使用最小的服務器內存。
  3. 數據必須儘快傳輸到客戶端。
  4. 進程的總持續時間應儘可能接近兩個進程(DB等待時間,網絡傳輸時間)的最大值,而不是兩個進程的時間總和。

到目前爲止,我們有三種模式,我們可以在運行代碼:

  1. 由於數據是從數據庫中取出,將其寫入響應流。
  2. 由於數據是從數據庫中獲取的,請將其保存在內存中。當數據庫讀取完成時,關閉數據庫連接並將數據從內存寫入響應流。
  3. 由於數據是從數據庫中提取的,因此將其寫入臨時文件。當從DB讀取完成時,關閉DB連接並從臨時文件讀取並寫入響應流。

正如你所想象的,這些完全不符合我們對所有場景的要求。我們已經討論了基於一些變量來實現一些代碼來猜測我們應該使用的三種代碼路徑中的哪一種,但我認爲這裏有一個更通用的解決方案,並且我正在尋找一些可以處理這個問題的代碼/庫爲了我們。

我正在尋找的東西是我可以環繞.NET流(輸出流),我可以從我們的HttpHandler寫入,並且它會處理將數據寫入基礎流。如果基礎流具有太多待處理數據,則它將存儲在內存中,並在稍後發送(如果可能)。一旦該內存緩衝區變得太大,它就會作爲緩衝區回退到臨時文件。當我嘗試關閉流時,它會阻塞,直到所有數據寫入流中。

你知道這樣的代碼嗎?我可以用它作爲起點,或者是一個類似這樣的庫,或者任何我應該注意的事情的指導。或者,我是否試圖完全過度設計這個解決方案?

+0

.NET 3.0/3.5解決方案可能是一個選項 - 如果沒有別的,我可以看看他們通知自定義實現的設計。 – 2009-07-08 03:02:15

回答

2

操作系統非常擅長在正確的時間將內存交換到磁盤。爲什麼不使用常規的緩衝流並讓交換空間成爲您的文件支持?

+0

根據我的經驗,這可能適用於非託管應用程序,但不適用於託管應用程序。從我所看到的,當一個系統受到內存壓力的時候,。NET運行了很多GC,這導致頁面被重新插入以檢查它們引用的內容。同樣,這是基於我在類似情況下看到的。也就是說,也許BufferedStream的實現可以解決這個問題 - 我會把它放在選項列表中。 – 2009-07-08 14:39:26