2010-05-04 5 views
2

공개 읽기 웹 사이트에 대한 캐시 삽입 방법을 잠글 때 다른 문제를 생각할 때 캐시에서 읽는 다른 스레드를 차단하는 것 외에도.HttpContext.Current.Cache.Insert 메서드를 잠그면 아무 문제가 없습니까?

실제 데이터 검색 및 캐시에 삽입하는 데는 1 초가 넘지 않아야합니다. 더 중요한 것은 여러 스레드가 잠재적으로 모두 Insert 메서드를 동시에 누르는 것을 원하지 않는다는 것입니다.

샘플 코드는 무엇인가 같습니다 : I 데이터의 양에 영향을 줄 수있는, 높은 아마도 때문에, 두 번 이상 수행하면 데이터 검색을 방지하기 위해이 작업을 수행 할 것으로 기대

public static readonly object _syncRoot = new object(); 

if (HttpContext.Current.Cache["key"] == null) 
{ 
    lock (_syncRoot) 
    { 
    HttpContext.Current.Cache.Insert("key", "DATA", null, DateTime.Now.AddMinutes(5), Cache.NoSlidingExpiration, CacheItemPriority.Normal, null); 
    } 
} 

    Response.Write(HttpContext.Current.Cache["key"]); 

답변

2

당신의 여러 사용자가 해당 검색을 트리거 할 때

이 방법은 스레드로부터 안전하기 때문에 Cache.Insert 자체의 잠금 장치는 쓸모가 없습니다. 이와 같은 잠금 장치는 이중 데이터 검색을 방지하는 데 유용 할 수 있지만,이 경우에 당신은 이중 확인 잠금을 사용하는 것이 좋습니다 :

var data = HttpContext.Current.Cache["key"]; 
if (data == null) 
{ 
    lock (_syncRoot) 
    { 
    // Here, check again for null after the lock. 
    var data = HttpContext.Current.Cache["key"]; 
    if (data == null) 
    { 
     var data = [RETRIEVE DATA] 
     HttpContext.Current.Cache.Insert("key", data, null, ...); 
    } 
} 
return data; 

그러나 당신의 주요 질문을. 너무 오랜 기간 동안 잠글 위험이 있기 때문에 웹 응용 프로그램에 많은 지연이 발생할 수 있으므로 걱정할 필요가 없습니다. Cache.Insert 주변의 자물쇠는 아무런 해를 끼치 지 않습니다.

+0

감사하지만 두 번 확인 된 잠금 장치에 대해 잘 모르겠습니다. 두 번째 null 체크는 어떤 이점을 가져 옵니까? – Ekk

+0

이 두 번째'data == null' 검사는'[RETRIEVE DATA]'부분이 한 번만 실행되도록합니다. 여러 스레드가 동시에 메서드를 호출 할 때'lock (_syncRoot) '은 한 번에 하나의 스레드 만 해당 블록을 실행하도록합니다. 다른 모든 스레드는 대기해야합니다. 그러나 첫 번째 스레드가 완료되면 첫 번째 대기 스레드는 해당 코드를 실행하고'[RETRIEVE DATA] '부분을 실행합니다. 그래서 두 번째'data == null' 체크가 필요합니다. – Steven

관련 문제