在多个应用程序之间共享Enterprise Library Database Cache

时间:2012-03-22 12:24:51

标签: c# .net caching static enterprise-library

我遇到了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。

2 个答案:

答案 0 :(得分:1)

Console_A和Console_B的应用程序域不同。即使您已将缓存管理器定义为静态,它也不会存在于应用程序域之外,因此实际上您有两个不相互了解的独立缓存管理器。

我建议使用服务(WCF)并通过该服务调用您的业务方法,这样所有控制台应用程序将调用相同的服务,并且它将有一个缓存管理器实例驻留在它自己的应用程序域中。

答案 1 :(得分:0)

这是设计的。

企业库缓存块被设计为进程内缓存,即使在使用基于数据库的后备存储时,只有在重新启动应用程序时才会进行状态恢复。它不是设计用作分布式缓存。

参考:Chris Tavares - MS Patterns & Practices Team