2012-03-22 103 views
0

我在企業庫5緩存塊中存在兩個應用程序共享相同數據庫緩存的奇怪問題。我寫了一個非常簡單的靜態緩存管理器類,它包裝了創建EntLib5 ICacheManager並讀取/寫入的內容。在多個應用程序之間共享企業庫數據庫緩存

private static ICacheManager _manager = null; 

private static ICacheManager Manager 
{ 
    get 
    { 
     lock (ClientLock) 
     { 
      if (_manager == null) 
       _manager = CacheFactory.GetCacheManager(); 

      return _manager; 
     } 
    } 
} 

public static object Get(string cacheKey) 
{ 
    return Manager.GetData(cacheKey); 
} 

public static void Add(string cacheKey, object cacheItem) 
{ 
    Manager.Add(cacheKey, cacheItem); 
} 

我的數據庫設置正確的是配置文件,我可以沒有任何問題的單一控制檯應用程序讀取&寫入到數據庫緩存。

但是我試圖做兩個應用程序共享相同的緩存之間的測試。問題似乎是,如果Console_A中的靜態CachingManager類將項目添加到緩存,則在Console_B實例化其靜態CacheManager後,Console_B不會收到這些更改。

下面是一個快速時間表來解釋。

Start Console_A 

Write Item1 from Console_A to Cache - (Static ICacheManager created with noticeable 1sec pause) Success - 1 Item in Cache 
Write Item2 from Console_A to Cache - Success - 2 Items in Cache 
Write Item3 from Console_A to Cache - Success - 3 Items in Cache 

Start Console_B 

Read Item1 from Cache to Console_B - (Static ICacheManager created with noticeable 1sec pause) - Success - 3 Items in Cache 
Read Item2 from Cache to Console_B - Success - 3 Items in Cache 
Read Item3 from Cache to Console_B - Success - 3 Items in Cache 

Write Item4 from Console_A to Cache - Success - 4 Items in Cache (Confirmed in DB) 
Read Item4 from Cache to Console_B - Failure - 3 Items in Cache 

因此,似乎一旦Console_B初始設置它的緩存管理器,它就不會回到數據庫來刷新數據。包含

我試過從我的屬性中刪除if(_manager == null)檢查,以便它每次從工廠拉出一個new CacheManager,但它沒有區別。

任何意見讚賞。

編輯

這似乎是當被的ICacheManager應用程序生命週期中實例化,但從來沒有一次不管你是否再次調用CacheFActory /統一EntLibContainer的LoadItems存儲過程只被調用。

回答

1

Console_A和Console_B的應用程序域不同。即使您已將緩存管理器定義爲靜態,它也不會超出應用程序域,因此您實際上有兩個彼此不瞭解的獨立緩存管理器。

我建議使用服務(WCF)並通過該服務調用您的業務方法,這樣所有控制檯應用程序將調用相同的服務,並且它將有一個緩存管理器實例駐留在其自己的應用程序域中。

+0

但我認爲緩存後備存儲移動到DB將是解決這個問題的確切的點。這會使EntLib緩存塊在多服務器負載平衡環境中非常無用,因爲您希望在多個節點之間進行緩存,因爲您仍然需要構建單個WCF服務來協調所有緩存調用。 – 2012-03-22 15:19:33

+0

用我的褲子下來。我沒有仔細閱讀,發現你已經將緩存後臺存儲移到了數據庫中。海事組織我同意,它應該工作。對不起,我沒有任何幫助。 – rie819 2012-03-22 17:25:52

+0

沒問題。事實證明它不應該。顯然,EntLib緩存塊從來不是爲了不被用作分佈式緩存而設計的。它純粹是一個內存緩存,而數據庫備份存儲僅用於在服務崩潰的情況下檢索CacheState。回到繪圖板找到EntLib#s Cache的替代選項。 :( – 2012-03-22 17:27:37

0

這是設計。

企業庫高速緩存塊設計爲進程高速緩存,甚至在使用基於數據庫的後備存儲時,只有在重新啓動應用程序時才用於狀態恢復。它並沒有被設計成用作分佈式緩存。

編號:Chris Tavares - MS Patterns & Practices Team

+0

另請參閱http://msdn.microsoft.com/zh-cn/library/ff664556 (v = pandp.50).aspx:「其他高速緩存解決方案將更適合於多個應用程序使用高速緩存或高速緩存與應用程序不在同一個位置的情況系統。例如,您無法跨Web場同步緩存。「 – 2012-03-23 05:56:13

相關問題