2012-08-05 2 views
2

실적이 좋지 않아 약간의 최적화가 필요한 기존 웹 사이트가 있습니다. Linq to SQL을 데이터 레이어로 사용하고 MVP 패턴을 UI 패턴으로 사용하는 asp.net 쇼핑 웹 사이트입니다.캐시 데이터가 변경 될 때까지

db에서 가장 값 비싼 엔터티는 일대 다 관계가있는 제품 및 범주 테이블입니다. 이 두 엔티티는 admin 그룹의 사용자가 제품이나 카테고리를 추가하기로 결정하지 않는 한 정기적으로 변경되지 않을 수 있습니다 ... 각 요청마다이 두 엔티티의 모든 것을 생성하고 가져 오는 것이 리소스 비용이 많이 드는 지 궁금합니다! 그래서 내 데이터를 보존 할 수있는 방법이 있다면 ...

먼저 데이터 검색에 AJAX를 사용하여 쿼리하거나 바인딩해야하는 엔티티 만 만들겠다고 생각했지만 어떻게해야합니까? 새 DataContext 인스턴스를 만들지 않고 그렇게 할 수 있습니까? !! 반면에 전체 DataContext에 대해 캐시를 사용하는 것은 메모리 비용 때문에 잘못된 결정으로 간주됩니다. 그러면 여기서 가장 좋은 옵션은 무엇입니까? 어떻게 개선 할 수 있습니까?

1) @HatSoft 제안하는 일을 UPDATE.

단점 : 이러한 접근 방식은 데이터베이스에만 도움이됩니다. 이 옆에는 메모리 문제가있을 수 있습니다. 렌더링 된 HTML 대신 메모리에 데이터를 넣고 있기 때문입니다. 그러나 이것은 디 커플 링과 관련하여 최상의 옵션 일 수 있습니다.

string pagePath = Context.Request.Url.AbsolutePath; 
object cacheKey = application[pagePath]; 
if(cacheKey == null) 
    return; //application restarted/first run so cache the stuff 
else 
    Context.Response.RemoveOutputCacheItem(pagePath); 

단점 : 출력 캐싱을 사용

2) 우리는 *에서 .aspx 와일드 카드 HTTP 처리기에서이 코드가 지금 우리는 페이지를 사용하는 각 데이터베이스 개체에 pagePath를 연결해야합니다,하지만 내가 그렇게한다면, 나는 그것들을 결합 해제하는 대신에 물건들을 연결시키고 있습니다. 이 접근법은 또한 약간의 하드 코딩을 실행합니다.

3) 다른 솔루션은 제어 캐시 모드 대신 포스트 캐시 모드에서 캐싱을 출력합니다. Subsituation 요소를 사용하고 OutPutCache Duration을 86400으로 설정하면 페이지가 24 시간마다 다시 생성됩니다.

단점 : 하위 구성 요소에 대한 html 출력을 동적으로 생성하는 사용자 정의 컨트롤을 동적으로 코딩합니다.

그래서 무엇을 제안합니까?

답변

1

나는이 문서 또한 http://www.asp.net/web-forms/tutorials/data-access/caching-data/using-sql-cache-dependencies-cs

이 응용 프로그램에 적합한 경우 난 당신이 응용 프로그램 시작시 캐시에 데이터를로드에 보이는 제안을 읽어 보시기 바랍니다 SqlDependency 클래스에보고 제안. 여기에 좋은 예를 보시길 바랍니다 http://www.asp.net/web-forms/tutorials/data-access/caching-data/caching-data-at-application-startup-cs

+0

내 업데이트를 확인하십시오. – jim

0

Linq2SQL을 사용하면 을 사용하여 LINQ 쿼리에 SqlDependency 전원 캐시를 제공 할 수 있습니다. IQueryable<Products>IEnumerable<Products>으로 변환하고 첫 번째 액세스 (기본 IQueryable의 첫 번째 반복) 이후에 양식 memmory를 열거합니다. SqlDependency 데이터 변경 알림을 기반으로하면 목록이 무효화되고 후속 액세스는 DB에서 다시 쿼리하고 결과를 캐시합니다.

내 제품 목록과 카테고리가 거의 변경되지 않고 매우 제한된 크기이기 때문에 메모리에 제품 목록과 카테고리를 캐시하는 것이 좋습니다.

+0

메모리 캐시에서 목록이 반환 될 때마다 DB 히트가 저장됩니다. –

+0

1) 많은 HTML 출력에서 ​​동일한 데이터를 사용할 수 있습니다 (예 : 범주 목록을 캐시하고 모든 * 페이지 응답에 사용됨). 2) 데이터에 명확한 만료 의미가 있습니다 (SqlDependency는 Categories 테이블의 백엔드 업데이트에서 캐시를 무효화합니다). 3) 처리를 저장하기 위해 생성 된 HTML을 캐시 할 수 있습니다. –

+0

* 모든 * 캐시는 최소한 * 한 번 * 데이터베이스를 사용해야하며, 그렇지 않으면 캐시가 아닙니다. 그리고 아무도'SqlCacheDependency'를 언급하지 않았고, 나는'SqlDependency'라고 말합니다. 읽기 http://rusanu.com/2006/06/17/the-mysterious-notification/ –

관련 문제