2012-03-22 108 views
0

我在企业库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存储过程只被调用。

回答

1

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

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

+0

但我认为缓存后备存储移动到DB将是解决这个问题的确切的点。这会使EntLib缓存块在多服务器负载平衡环境中非常无用,因为您希望在多个节点之间进行缓存,因为您仍然需要构建单个WCF服务来协调所有缓存调用。 – 2012-03-22 15:19:33

+0

用我的裤子下来。我没有仔细阅读,发现你已经将缓存后台存储移到了数据库中。海事组织我同意,它应该工作。对不起,我没有任何帮助。 – rie819 2012-03-22 17:25:52

+0

没问题。事实证明它不应该。显然,EntLib缓存块从来不是为了不被用作分布式缓存而设计的。它纯粹是一个内存缓存,而数据库备份存储仅用于在服务崩溃的情况下检索CacheState。回到绘图板找到EntLib#s Cache的替代选项。 :( – 2012-03-22 17:27:37

0

这是设计。

企业库高速缓存块设计为进程高速缓存,甚至在使用基于数据库的后备存储时,只有在重新启动应用程序时才用于状态恢复。它并没有被设计成用作分布式缓存。

编号:Chris Tavares - MS Patterns & Practices Team

+0

另请参阅http://msdn.microsoft.com/zh-cn/library/ff664556 (v = pandp.50).aspx:“其他高速缓存解决方案将更适合于多个应用程序使用高速缓存或高速缓存与应用程序不在同一个位置的情况系统。例如,您无法跨Web场同步缓存。“ – 2012-03-23 05:56:13

相关问题