문제

현재 ASP.NET의 C# 3.5의 프로젝트 관리자 응용 프로그램을 작업 중입니다. 데이터베이스로의 적중을 줄이기 위해 정적 변수를 사용하여 많은 정보를 캐시하고 있습니다. 예를 들어, 사용자 목록은 정적 클래스에서 메모리에 보관됩니다. 클래스는 시작시 데이터베이스의 모든 정보를 읽고 변경 될 때마다 데이터베이스를 업데이트하지만 DateBase에서 읽을 필요는 없습니다.

클래스는 데이터베이스에 쓰기와 동시에 업데이트 된 정보로 다른 웹 서버 (존재하는 경우)를 핑합니다. Pinging 메커니즘은 캐시 객체가 임의의 사용 가능한 포트를 사용하여 등록하는 Windows 서비스입니다. 다른 것들에도 사용됩니다.

데이터의 양이 그다지 크지는 않습니다. 현재 사용자 (비밀번호 해시, 권한, 이름, 이메일 등)를 캐시하는 데 사용하는 순간 데이터베이스에 대한 통화 더미를 저장합니다.

이 방법에 함정이 있는지 또는 데이터를 캐시하는 더 좋은 방법이 있는지 궁금합니다.

도움이 되었습니까?

해결책

함정 : 정적 필드는 앱 도메인별로 스코핑되며로드가 증가하면 서버가 풀에서 더 많은 앱 도메인을 생성 할 수 있습니다. 통계에서만 읽는 경우 반드시 문제가 될 필요는 없지만 메모리에서 중복 데이터가 표시되며 앱 도메인이 생성되거나 재활용 될 때마다 적중을 얻게됩니다.

캐시 객체를 사용하는 것이 좋습니다. 이와 같은 것을위한 것입니다.

편집 : appDomains에 대해 틀렸다는 것이 밝혀졌습니다 (주석에서 지적한대로) - 더 많은 인스턴스 신청 부하에 따라 생성되지만 모두 동일한 AppDomain에서 실행됩니다. (하지만 여전히 캐시 객체를 사용해야합니다!)

다른 팁

캐시가 사용 가능한 메모리의 양보다 크기가 커지지 않을 것이라고 기대할 수있는 한 괜찮습니다. 또한 데이터베이스 당이 애플리케이션의 인스턴스가 하나만 있거나 앱의 다른 인스턴스의 캐시가 "동기화되지 않을 수 있습니다".

내가 일하는 곳에, 우리는 자체로 자란 O/RM을 가지고 있으며, 우리는 성장하거나 변화 할 것으로 예상되지 않는 특정 테이블로 당신이하고있는 것과 비슷한 일을합니다. 따라서, 당신이하는 일은 전례가 없으며 실제로 우리 시스템에서 시도되고 사실입니다.

당신이 고려해야 할 또 다른 함정은 실 안전입니다. 모든 응용 프로그램 요청은 동일한 appDomain에서 실행되지만 다른 스레드에서 나올 수 있습니다. 정적 변수에 액세스하려면 여러 스레드에서 액세스 할 수 있어야합니다. 아마도 당신이 찾고있는 것보다 조금 더 오버 헤드 일 것입니다. 캐시 객체 가이 목적을 위해 더 좋습니다.

흠 ... "클래식"메소드는 응용 프로그램 캐시이지만 정적 변수를 업데이트하지 않거나 그렇게하면 잠금 문제를 이해하지 못하면 AppDomain 재시작으로 언제든지 사라질 수 있음을 이해합니다. 정적을 사용하는 데 실제로 피해를 입 힙니다.

앱에 분산 캐시를 사용하는 방법을 살펴 보는 것이 좋습니다. 당신은 볼 수 있습니다 ncache 또는 indexus.net

내가 제안한 이유는 당신이 당신이 캐시하고있는 정보를 업데이트하는 자신의 임시 방법을 굴 렸기 때문입니다. 정적 변수/참조는 괜찮지 만 업데이트/새로 고침되지 않으므로 직접 노화를 처리해야합니다). 분산 설정이있는 것 같습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top