在多个应用程序之间共享企业库数据库缓存

本文关键字:企业库 数据库 缓存 共享 之间 应用程序 | 更新日期: 2023-09-27 18:28:34

我在Enterprise Library 5缓存块中遇到了一个奇怪的问题,其中两个应用程序共享同一个数据库缓存。我已经编写了一个非常简单的静态缓存管理器类,它完成了EntLib5ICacheManager的创建,以及对它的读/写

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,但在应用程序生命周期中,无论是否再次调用CacheFActory/Unity EntLibContainer,都不会再次调用。

在多个应用程序之间共享企业库数据库缓存

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

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

这是经过设计的。

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

参考:Chris Tavares-MS Patterns&实践团队