我在企业库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