2009-04-16 12 views
20

이전에는 HttpRuntime.Cache 메커니즘에 액세스하는 것과 관련된 잠금 장치가 있습니다. 내가 과거에 정말로이 문제를 조사하고 눈을 감아 서 자물쇠로 감싸고 있는지 확실하지 않습니다.HttpRuntime.Cache 모범 사례

정말 필요한가요?

+0

http://stackoverflow.com/questions/447705/locking-httpruntime-cache-for-lazy-loading 캐시가 스레드 안전 인 것 같습니다 –

+0

언어/플랫폼입니까? – Javier

답변

2

.Cache 속성이 정적이며 스레드로부터 안전하므로 잠금을 사용하여 HttpRuntime.Cache 속성에 대한 액세스를 래핑 할 필요가 없다고 생각합니다.

캐시 개체 (HttpRuntime.Cache, HttpContext.Current.Cache, Page.Cache 등)에 액세스하는 데는 여러 가지 방법이 있습니다. 응용 프로그램 도메인 당 Cache 객체는 하나뿐이기 때문에 모두 동일한 Cache 객체에 액세스합니다. 이는 실제로 스레드로부터 안전한 Singleton 객체이기 때문입니다.

10

이 문서는 잠금이 사용되어야한다 제안 :

http://msdn.microsoft.com/en-us/magazine/cc500561.aspx

인용구 :

문제는 당신이 30 초 소요 쿼리를 얻고 한 경우 당신이있어 것입니다 매초마다 페이지를 실행 중일 때 캐시 항목을 채우는 데 걸리는 시간 인 29 개의 다른 요청은 이됩니다.이 모든 요청은 이됩니다. ~ 은 데이터베이스에 대한 자신의 쿼리로 캐시 항목을 채 웁니다. 이 문제를 해결하려면 에 스레드 잠금을 추가하여 에서 다른 페이지 실행을 중단하고 데이터베이스에서 데이터를 요청할 수 있습니다.

여기에 자신의 코드입니다 : 나는이 코드를 테스트하지 않았습니다

// check for cached results 
object cachedResults = ctx.Cache["PersonList"]; 
ArrayList results = new ArrayList(); 

if (cachedResults == null) 
{ 
    // lock this section of the code 
    // while we populate the list 
    lock(lockObject) 
    { 
    cachedResults = ctx.Cache["PersonList"]; 
    // only populate if list was not populated by 
    // another thread while this thread was waiting 
    if (cachedResults == null) 
    { 
     cachedResults = ... 
     ctx.Cache["PersonList"] = cachedResults; 
    } 
    } 
} 

,하지만 난 프로덕션 환경에서이 방법을 평가 사람을 듣고 매우 관심이있을 것입니다.

+11

캐싱 스레드 안전성 측면에서 이것이 필요하지 않다고 생각합니다. 잠재적으로 값 비싼 쿼리를 실행하기 위해 데이터베이스에 대한 다중 액세스를 방지하는 것이 좋습니다. – zcrar70

+1

나는 당신에 동의합니다. – frankadelic

+5

예에서 작지만 중요한 점은 잠금 (lockObject)과 if (cachedResults == null) 사이에서 캐시 된 항목을 다시 검색해야한다는 것입니다. 이 http : // stackoverflow를 참조하십시오.com/questions/39112/what-is-the-the-best-way-to-lock-cache-in-asp-net을 참조하십시오. –

2

특히 응용 프로그램을 실행하는 서버가 여러 곳인 프로덕션 환경에서는 잠김이 아래의 문제에 대한 해답이라고 생각하지 않습니다.

문제는 30 초가 걸리고 1 초마다 페이지를 실행하면 캐시 항목을 채우는 데 걸리는 시간에 29 가지의 다른 요청이 들어갑니다. 데이터베이스에 대한 자체 쿼리를 사용하여 캐시 항목을 채 웁니다. 이 문제점을 해결하기 위해 스레드 잠금을 추가하여 다른 페이지 실행이 데이터베이스에서 데이터를 요청하지 못하게 할 수 있습니다.