我在企業庫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
存儲過程只被調用。
但我認爲緩存後備存儲移動到DB將是解決這個問題的確切的點。這會使EntLib緩存塊在多服務器負載平衡環境中非常無用,因爲您希望在多個節點之間進行緩存,因爲您仍然需要構建單個WCF服務來協調所有緩存調用。 – 2012-03-22 15:19:33
用我的褲子下來。我沒有仔細閱讀,發現你已經將緩存後臺存儲移到了數據庫中。海事組織我同意,它應該工作。對不起,我沒有任何幫助。 – rie819 2012-03-22 17:25:52
沒問題。事實證明它不應該。顯然,EntLib緩存塊從來不是爲了不被用作分佈式緩存而設計的。它純粹是一個內存緩存,而數據庫備份存儲僅用於在服務崩潰的情況下檢索CacheState。回到繪圖板找到EntLib#s Cache的替代選項。 :( – 2012-03-22 17:27:37