2008-12-29 26 views
1

我需要創建一個HttpHandler來提供一個圖像文件(簡單的靜態文件),並且它會在SQL Server表中插入一條記錄。 (例如http://site/some.img,其中some.img是一個HttpHandler)我需要一個內存中的對象(如通用列表對象),我可以添加項目到每個請求(我也必須考慮每秒數百或數千請求)和我應該能夠使用SqlBulkCopy將這個內存中的對象卸載到sql表中。需要關於ASP.Net內存隊列的建議

列表 - >數據表 - > SqlBulkCopy的

我想用緩存的對象。創建一個通用列表對象,並將其保存在HttpContext.Cache中,並每次插入一個新的Item。這將不起作用,因爲當HttpHandler嘗試添加新項目時,CacheItemRemovedCallback將立即觸發。我不能將Cache對象用作內存隊列。

任何人都可以提出任何建議嗎?如果負載更大,我將來可以擴展嗎?

回答

0

如何使用通用列表存儲請求並使用不同的線程來執行SqlBulkCopy?

這種將請求存儲在列表中的方式不會阻止響應時間過長,後臺線程將能夠在自己的時間更新Sql,每隔5分鐘進行一次。

您甚至可以通過執行CacheItemRemovedCallback上的工作將後臺線程基於Cache機制。

只需插入一些刪除時間爲5分鐘的對象,並在處理工作結束時重新插入它。

1

爲什麼CacheItemRemovedCalledback在將某些內容添加到隊列時觸發?這對我來說沒有任何意義......即使這樣做確實如此,這裏沒有任何要求任何事情。也許我誤解了你的要求?

我已經非常成功地以這種方式使用了Cache對象。這就是它的設計目的,並且它的尺寸非常好。我存儲了每個應用頁面請求訪問的Hashtable,並根據需要更新/清除。

選項二......你真的需要隊列嗎?如果你只是想直接寫入數據庫,SQL Server也可以很好地擴展。使用共享連接對象和/或連接池。

0

謝謝亞歷克斯&布賴恩爲您的建議。當我嘗試替換第二個請求的緩存中的List對象(現在count應該是2)時,CacheItemRemovedCalledback會被觸發,因爲我正在使用新對象替換當前緩存對象。起初,我也認爲這是一種奇怪的行爲,所以我必須深入研究它。 另外,對於第二個建議,我將嘗試插入記錄(使用緩存的SqlConnection對象),並查看執行壓力測試時獲得的性能。我懷疑我會得到奇妙的數字,因爲它是I/O操作。

我會繼續在您的建議下尋求最佳解決方案。

+0

如果你會嘗試逐一插入記錄,我懷疑你會得到可以接受的性能。我試圖建議的是用批量更新數據庫,並記錄數量。看看msdn上的SqlBulkCopy。 – 2009-01-01 16:16:50

0

您可以在回調中創建一個條件要求,以確保您正在已從到期,而不是刪除緩存命中項工作/替換(在VB中,因爲我有它方便):

Private Shared Sub CacheRemovalCallbackFunction(ByVal cacheKey As String, ByVal cacheObject As Object, ByVal removalReason As Web.Caching.CacheItemRemovedReason) 
    Select Case removalReason 
     Case Web.Caching.CacheItemRemovedReason.Expired, Web.Caching.CacheItemRemovedReason.DependencyChanged, Web.Caching.CacheItemRemovedReason.Underused 
     ' By leaving off Web.Caching.CacheItemRemovedReason.Removed, this will exclude items that are replaced or removed explicitly (Cache.Remove) ' 
    End Select 
End Sub 

編輯這是在C#中,如果你需要它:

private static void CacheRemovalCallbackFunction(string cacheKey, object cacheObject, System.Web.Caching.CacheItemRemovedReason removalReason) 
{ 
    switch(removalReason) 
    { 
     case System.Web.Caching.CacheItemRemovedReason.DependencyChanged: 
     case System.Web.Caching.CacheItemRemovedReason.Expired: 
     case System.Web.Caching.CacheItemRemovedReason.Underused: 
      // This excludes the option System.Web.Caching.CacheItemRemovedReason.Removed, which is triggered when you overwrite a cache item or remove it explicitly (e.g., HttpRuntime.Cache.Remove(key)) 
      break; 
    } 
} 
0

在我之前的評論擴大......我讓你不正確思考的緩存圖片。如果你有一個對象存儲在緩存中,比如說一個Hashtable,那麼對這個Hashtable的任何更新/存儲都將被持久化,而不會明確修改緩存的內容。只需在應用程序啓動時或首次請求時將Hashtable添加到緩存中一次即可。

如果你擔心批量複製和頁面請求更新同時發生,那麼我建議你簡單的有兩個緩存列表。有一個是在頁面請求進入時更新的列表,以及一個用於批量複製操作的列表。當一個批量複製完成時,交換列表並重復。這與視頻遊戲或視頻應用的雙緩衝視頻RAM類似。