2014-04-23 1 views
3

맹세를 탐지하는 유효성 검사 주석이 있습니다. 저의 맹공은 데이터베이스에 있지만 불필요한 쿼리를 피하기 위해 메모리에 보관하고 싶습니다. 유효성 검사 주석 클래스에 swearwords의 정적 목록 (일반 오래된 문자열)을 추가하고 응용 프로그램을 실행하는 동안 유효성 검사를 처음 사용할 때 데이터베이스에있는 내용을 기반으로 채울 것을 생각했습니다. 이러한 솔루션 사용과 관련된 위험이 있습니까?다음 시나리오에서 MVC 응용 프로그램에서 정적 필드를 사용할 때 위험이 있습니까?

P. 나는 누군가가 응용 프로그램을 실행하는 동안 데이터베이스에 더 많은 단어를 추가하는지 실제로 신경 쓰지 않습니다. "다음 재시작까지"불완전한 목록을 갖는 것은 충분합니다 (앱은 매일 다시 시작됩니다).

+1

응용 프로그램 풀이 다시 시작되거나 재활용 될 때까지 데이터가 고쳐지지 않는지 정말로 신경 쓰지 않는다면 접근 방식은 잘 작동합니다. 광범위한 설명을 위해 –

답변

1

은 읽기 스레드로부터 안전합니다.

쓸데없는 한 여러 스레드에서 동시에 읽을 수 있으므로 List<T>을 사용하는 것이 좋습니다. the documentation에서

하십시오 List<T>만큼 컬렉션이 수정되지 않는 한, 동시에 다수의 독자를 지원할 수

.

4

만료 기간이있는 HttpContext.Current.Cache으로 지정하는 것이 좋습니다. 그런 다음이 데이터는 캐시에서 만료되면 제거되고 실제 최신 데이터를 다시로드 할 수 있습니다. 이 경우 정적 목록보다 데이터의 실제가 더 좋습니다.

당신은 코드를 작성할 수 있습니다 그럼 당신이 부동산에 처음으로 액세스하는 경우

public static List<string> SwearWords 
{ 
    get 
    { 
     List<string> items = HttpContext.Current.Cache["SwearWords"] as List<string>() 
     if (items == null) 
     { 
      items = LoadThemFromDB(); 
      HttpContext.Current.Cache.Insert("SwearWords", 
       items, 
       null, 
       DateTime.Now.AddMinutes(10), 
       Cache.NoSlidingExpiration); 
     } 
     return items; 
    } 
} 

를 - 그것은 10 분 동안 DB 및 캐시에서 그들을로드합니다. 10 분 후에 캐시에서 제거되고 이후에 다시 액세스되는 경우 최신 데이터를로드하고 다시 캐시합니다.

정적 목록의 경우 DB에서 SwearWords가 업데이트되는 경우 수동으로 플러시/업데이트해야합니다.

IIS는 20 분 동안 사용하지 않으면 응용 프로그램 풀을 중지한다는 것을 기억해야합니다. 20 분 동안 사용자가 없으면 자동으로 다시 시작됩니다. 그리고 정적 목록 \이 캐시는 마르쿠스 코멘트 얹는 응용 프로그램 도메인

에서 삭제됩니다 - 여기가 하나 개 이상의 쓰레드에 의해 호출 될 경우 경우에 LoadThemFromDB의 중복 호출을 피할 더블 체크와 같은 샘플입니다 동시에 :

private static readonly object _swearWordsLockObj = new object(); 

public static List<string> SwearWords 
{ 
    get 
    { 
     List<string> items = HttpContext.Current.Cache["SwearWords"] as List<string>() 
     if (items == null) 
     { 
      lock(_swearWordsLockObj) 
      { 
       items = HttpContext.Current.Cache["SwearWords"] as List<string>() 
       if (items == null) 
       { 
        items = LoadThemFromDB(); 
        HttpContext.Current.Cache.Insert("SwearWords", 
         items, 
         null, 
         DateTime.Now.AddMinutes(10), 
         Cache.NoSlidingExpiration); 
       } 
      } 
     } 
     return items; 
    } 
} 

더블라는 이름의이 코드

는 잠금 확인 - 단어를 맹세의 목록있는 한 http://en.wikipedia.org/wiki/Double-checked_locking

+0

+1. DB에서 데이터를 여러 번로드하는 것을 피하기 위해 샘플에 스레드 동기화를 추가 할 수 있습니다. – Markus

+0

추가됨. 감사! :) –

관련 문제