2012-02-01 7 views
1

캐시 객체를 사용하여 XMLDocument 객체를 보유하고있었습니다. 는 구체적으로, 코드는 다음과 같습니다거의 읽기 전용 객체가있는 ASP.NET 스레드 안전 캐시 객체 사용

XmlDocument xDoc = new XmlDocument(); 
if (HttpRuntime.Cache.Get("AuthorizationXML") == null) 
{ 
    string file = GetAuthorizationXmlFilePath(); 
    xDoc.Load(file); 
    HttpRuntime.Cache.Insert("AuthorizationXML", xDoc, new CacheDependency(file)); 
} 
else 
{ 
    xDoc = (XmlDocument)HttpRuntime.Cache.Get("AuthorizationXML"); 
} 

return xDoc; 

어쨌든, 내 팀 리더가 캐시 개체는 스레드로부터 안전하기 때문에, 그것은 낭비가 거의 읽기 전용 목적을 위해 사용하는 것이며,을 구현하기 위해 더 좋을 것이라고 제안 객체를 응용 프로그램 객체의 싱글 톤 프리 스레드 객체로 캐시합니다. 이 문장은 합법적이라고 보입니까? 스레드 안전이란 캐시 개체가 잠금으로 구현된다는 의미입니다. 시스템이 느려 집니까? 캐시에서 읽는 중일 때 잠금 기능이 적용됩니까? 의견을 보내 주시면 감사하겠습니다.

+1

코드에 경쟁 조건이 있습니다. 처음 체크했을 때 캐쉬 항목이 null이 아니므로 'else' 절로 이동하면 항목이 캐시에서 사라질 수 있습니다. – LukeH

+0

고마워요.하지만 Null로 변경하려고하지 않을 것입니다. 한 번만로드되고 null로 설정된 코드가 없으므로 그냥 읽어야합니다. – Tomer

답변

1

ASP.NET은 캐시의 항목을 변경하는 경우에만 스레드 안전성을 보장하지만 캐시에있는 개체를 변경할 때는 어떠한 보장도하지 않습니다. 따라서 캐시에서 검색 한 객체가 변경 불가능 (= 생성 후 변경할 수 없음) 인 경우 ASP.NET 캐시는 이 아니며은 사용자를 보호합니다.

이 아닌 객체은 불변이어야합니다. 이 아닌은 여러 스레드에서 재사용해야합니다. ASP.NET 캐시 또는 일부 전역 적으로 정의 된 변수에 저장하면 중요하지 않습니다. 스레드를 통해 변경 가능한 개체를 재사용하는 것은 위험하며, (실수로) 변경되는 경우 경쟁 조건으로 이어질 수 있습니다.

개체가 불변 인 경우 모든 스레드가 위험없이 사용할 수 있기 때문에 개체를 저장할 위치는 중요하지 않습니다. Cache 또는 Global/Singleton 사용에 대한 선택은 객체의 스레드 안전성과 아무 관련이 없습니다. 둘 다 스레드 안전 객체가 필요하고 캐시의 보장이 절름발이이므로이 방법이 도움이되지 않습니다.

ASP.NET 캐시는 일정 기간 캐시에 항목을 보관할 수있게 해주지 만 AppDomain이 종료 될 때까지 (정의에 따라) 싱글 톤이 유지됩니다. 따라서 AppDomain 수명 (한 예로 CacheDependency을 사용하여 예제와 함께 표시) 당 두 번 이상 항목을 새로 고치려면 Singleton 이외의 항목을 새로 고침해야합니다. (예 : ASP.NET 캐시).

+0

OP의 관심사는 객체가 안전하게 액세스되도록 보장하는 것이 아니라 퍼포먼스를 향상시키는 것입니다. 캐시가 한 번에 하나의 판독기 만 허용하고 응용 프로그램이 변수를 읽는 경우에는 많은 스레드가 대기 할 실제 이유가 없을 때 대기합니다. 그러나 캐시가 스마트 판독기/기록기 잠금으로 구현 된 경우 이는 문제가되지 않습니다. OP의 질문은 사용되는 잠금 메커니즘과 많은 양의 동시 읽기를 수행하는 방법입니다. – Servy

+0

Servy, 고맙습니다. 정확히 내가 목표하고있는 것입니다. Steven에게 감사합니다. CacheDependency를 사용하고 있지만 실제로 XML을 변경할 가능성은 거의 없습니다. 단지 안전을위한 것입니다. 또한 내가 알고있는 한 캐시가 싱글 톤으로 구현되어 있으므로 선택의 여지가 없다. 어쨌든 싱글 톤이 될 것이고, 스레드 안전 = 락이 있다면 일반적으로 성능 문제가 있는지 궁금 할 것이다. 닷넷 구현 그것은 이것을 좋아한다. 나는 개체가 불변인지 확인하는 방법이 있습니까? 성능 문제에 대한 더 많은 답변을 원합니다. – Tomer

+0

캐시 주위에 잠금 장치가 있다면 리더/라이터 잠금 장치를 사용한다는 것이 합당하다고 확신 할 수 있습니다. 또한 캐시에 액세스하는 것은 너무 빠르므로 잠금이 유지되는 시간이 상당히 짧아야합니다.그러나 그것들은 단지 교육받은 추측 일 뿐이며, 따라서 나는 실제적인 대답이 없다는 언급이 없다. – Servy

관련 문제