2012-03-22 6 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); 
} 

내 데이터베이스가 올바르게 설정입니다.

그러나 동일한 캐시를 공유하는 두 응용 프로그램간에 테스트를 수행하려고합니다. 콘솔 _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가 일단 캐시 관리자를 설정하면 데이터베이스를 다시 열어 데이터를 새로 고치는 것 같지 않습니다. the Contains

나는 내 공장에서 if(_manager == null) 수표를 제거하려고 시도 했으므로 매번 공장에서 new CacheManager를 가져 오지만 아무런 효과가 없었다.

감사의 말.

편집

그것은 ICacheManager에 관계없이 다시 CacheFActory/유니티 EntLibContainer를 호출 여부의 애플리케이션 라이프 사이클 동안 결코 다시 인스턴스화하지만 때 LoadItems SPROC 만 호출되는 것으로 보인다.

답변

1

Console_A 및 Console_B의 응용 프로그램 도메인이 다릅니다. 캐시 관리자를 정적으로 정의 했더라도 응용 프로그램 도메인 이외에 존재하지 않으므로 실제로는 서로에 대해 알지 못하는 두 개의 개별 캐시 관리자가 있습니다.

서비스 (WCF)를 사용하고 해당 서비스를 통해 비즈니스 메서드를 호출하는 것이 좋습니다. 그러면 모든 콘솔 응용 프로그램이 동일한 서비스를 호출하고 자신의 응용 프로그램 도메인에있는 캐시 관리자의 한 인스턴스를 갖게됩니다 .

+0

하지만이 정확하게 문제를 해결 얻을 수있을 것이다 DB에 캐시 백업 저장소를 이동하는 점을 생각했다. 이렇게하면 EntLib Caching Block이 다중 노드로드 균형 환경에서 여러 노드 사이에서 캐싱을 원할 때 바로 사용할 수있게됩니다. 좌표를 지정하기 위해 단일 WCF 서비스를 만들어야하기 때문입니다. 모든 캐시 호출. –

+0

바지 입었다. 캐시 백킹 스토어를 DB로 옮겼다는 것을 알기에 충분히 가까이서 읽지 않았습니다. IMO 동의합니다. 작동해야합니다. 미안 내가 도움이되지 않았어. – rie819

+0

문제 없습니다. 그것이 나오면 안된다.분명히 EntLib Caching 블록은 분산 캐시로 사용되지 않도록 설계되지 않았습니다. 순전히 메모리 내 캐시이고 DB Backing Store는 서비스가 실패한 경우 CacheState를 검색 할 수 있도록 설계되었습니다. EntLib # s Cache에 대한 대체 옵션을 찾으려면 드로잉 보드로 돌아갑니다. : –

0

이것은 의도적으로 설계된 것입니다.

엔터프라이즈 라이브러리 캐싱 블록은 In Process Cache로 설계되었으며 DB 기반 백업 저장소를 사용하는 경우에도 응용 프로그램을 다시 시작할 때 상태 복구에만 사용됩니다. 분산 캐시로 사용하도록 설계되지 않았습니다.

참조 : Chris Tavares - MS Patterns & Practices Team

+0

http://msdn.microsoft.com/en-us/library/ff664556 (v = pandp.50) .aspx : "다른 캐싱 솔루션은 캐시를 사용하는 여러 응용 프로그램이 있거나 캐시와 응용 프로그램이 동일하지 않은 상황에서 더 적합합니다 시스템. 예를 들어 웹 팜 전체에서 캐싱을 동기화 할 수 없습니다. " –

관련 문제