我遇到了Enterprise Library 5 Caching Block的一个奇怪问题,其中两个应用程序共享同一个数据库缓存。我编写了一个非常简单的静态缓存管理器类,它包装了创建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中的Static CachingManager类将项添加到Cache,则在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时调用LoadItems
Sproc,而在应用程序生命周期中再也不会调用{{1}} Sproc,无论你是否再次调用CacheFActory / Unity EntLibContainer。
答案 0 :(得分:1)
Console_A和Console_B的应用程序域不同。即使您已将缓存管理器定义为静态,它也不会存在于应用程序域之外,因此实际上您有两个不相互了解的独立缓存管理器。
我建议使用服务(WCF)并通过该服务调用您的业务方法,这样所有控制台应用程序将调用相同的服务,并且它将有一个缓存管理器实例驻留在它自己的应用程序域中。
答案 1 :(得分:0)
这是设计的。
企业库缓存块被设计为进程内缓存,即使在使用基于数据库的后备存储时,只有在重新启动应用程序时才会进行状态恢复。它不是设计用作分布式缓存。