20
A
回答
8
根據此文檔http://msdn.microsoft.com/en-us/library/system.web.caching.cache(VS.80).aspx訪問緩存對象是線程安全的。 至於你存儲在緩存線程中的對象,安全性必須來自其他地方。
2
我不認爲有必要用一個鎖來包裝對HttpRuntime.Cache屬性的訪問,因爲.Cache屬性是靜態的,也是線程安全的。
訪問Cache對象有許多不同的方式(HttpRuntime.Cache,HttpContext.Current.Cache,Page.Cache等)。它們都訪問同一個Cache對象,因爲每個Application Domain只有一個Cache對象,因爲它實際上是一個線程安全的Singleton對象。
10
本文提出了一種鎖應該使用:
http://msdn.microsoft.com/en-us/magazine/cc500561.aspx
報價:
的問題是,如果你已經有了一個 查詢需要30秒,你就 每秒執行一次頁面,在 填充緩存項目所需的時間,29其他請求將 進來,所有這些將嘗試到 用自己的 查詢到數據庫填充緩存項目。爲解決此問題,您可以將線程鎖添加到 停止從 請求數據庫中的其他頁執行。
這裏是他們的代碼片段:
// check for cached results
object cachedResults = ctx.Cache["PersonList"];
ArrayList results = new ArrayList();
if (cachedResults == null)
{
// lock this section of the code
// while we populate the list
lock(lockObject)
{
cachedResults = ctx.Cache["PersonList"];
// only populate if list was not populated by
// another thread while this thread was waiting
if (cachedResults == null)
{
cachedResults = ...
ctx.Cache["PersonList"] = cachedResults;
}
}
}
我還沒有測試此代碼,但我會聽到別人誰評估在生產環境中這種方法很感興趣。
2
我不認爲鎖定是下面問題的答案,特別是在生產環境中,您有幾臺服務器運行您的應用程序。
問題是,如果你有一個需要30秒的查詢,並且你每秒執行一次頁面,在填充緩存項目所需的時間內,將會有29個其他請求進入,所有這些請求將嘗試用自己的查詢填充緩存項目到數據庫。爲了解決這個問題,你可以添加一個線程鎖來停止其他頁面執行從數據庫請求數據。
相關問題
- 1. 最佳實踐
- 2. 最佳實踐
- 3. 最佳實踐
- 4. 最佳實踐
- 5. 最佳實踐
- 6. 最佳實踐
- 7. 最佳實踐
- 8. 最佳實踐
- 9. 最佳實踐
- 10. 最佳實踐
- 11. 最佳實踐?
- 12. 最佳實踐
- 13. 最佳實踐
- 14. 最佳實踐
- 15. 最佳實踐
- 16. 最佳實踐
- 17. 最佳實踐
- 18. 最佳實踐
- 19. 最佳實踐
- 20. 最佳實踐:
- 21. 最佳實踐
- 22. 最佳實踐
- 23. DataContractSerializer最佳實踐?
- 24. CSS最佳實踐
- 25. LDAP最佳實踐
- 26. DataBindingSource最佳實踐
- 27. Lisp最佳實踐
- 28. 最佳實踐3
- 29. MVC最佳實踐
- 30. DataSet最佳實踐?
http://stackoverflow.com/questions/447705/locking-httpruntime-cache-for-lazy-loading 似乎緩存是線程安全的 – 2009-04-16 03:34:54
語言/平臺? – Javier 2009-04-16 03:35:00