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

C# 在多个应用程序之间共享企业库数据库缓存,c#,.net,caching,static,enterprise-library,C#,.net,Caching,Static,Enterprise Library,我对EnterpriseLibrary5缓存块有一个奇怪的问题,其中两个应用程序共享同一个数据库缓存。我已经编写了一个非常简单的静态缓存管理器类,它完成了EntLib5 ICacheManager的创建和读写 private static ICacheManager _manager = null; private static ICacheManager Manager { get { lock (ClientLock) {

我对EnterpriseLibrary5缓存块有一个奇怪的问题,其中两个应用程序共享同一个数据库缓存。我已经编写了一个非常简单的静态缓存管理器类,它完成了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(\u manager==null)
检查,这样每次它都会从工厂中提取一个
新的
缓存管理器,但没有什么不同

谢谢你的建议

编辑


似乎只有在实例化ICacheManager时才会调用
LoadItems
存储过程,但无论是否再次调用CacheFActory/Unity EntLibContainer,在应用程序生命周期中都不会再调用该存储过程。

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

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

这是设计的

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


Ref:

但我认为将缓存备份存储移动到DB的目的是为了解决这个问题。这将使EntLib缓存块在一个多服务器负载平衡环境中变得毫无用处,在这个环境中,您需要在多个节点之间进行缓存,因为您仍然需要构建一个WCF服务来协调所有缓存调用。我没有仔细阅读,没有意识到您已将缓存备份存储移动到数据库。我同意,它应该会起作用。对不起,我帮不了什么忙,没问题。事实证明不应该。显然,EntLib缓存块从来都不是为不打算用作分布式缓存而设计的。它纯粹是一个内存缓存,DB备份存储区仅用于在服务崩溃时检索CacheState。返回绘图板,找到EntLib缓存的替代选项:(同样,在不知道您的范围的情况下,如果您拥有将在多个应用程序中使用的共享数据,这听起来是SOA设计的一个很好的候选者。共享数据位于它自己的服务中,可以由任何一个应用程序调用。我们已经有了SOA体系结构。问题是使用单个WCF服务作为缓存点限制了它的可扩展性。您无法负载平衡/分发该服务。别担心。已经在研究专为分布式场景设计的memcache/ncache和AppFabric替代方案。EntLib只是一个简单的工具,因为我们已经将其用于数据/记录和异常处理。另请参见:其他缓存解决方案更适合于以下情况:有多个应用程序使用缓存,或者缓存和应用程序不在同一系统上。例如,您无法跨Web场同步缓存