2013-05-11 6 views
1

정확하게 이해 했습니까?컨텍스트 로딩

웹 응용 프로그램을 실행하여 페이지를보고 컨텍스트의 인스턴스를 만들 때 인스턴스에 모든 데이터베이스 날짜가로드됩니다.

메모리를 많이 차지하지 않으면 5 년간의 블로그 블로그에 1,500 ~ 2,000 (또는 그 이상)의 게시물이있을 수 있으며 모든 댓글 태그 등은 많은 양의 데이터가 될 수 있습니다. .

그렇다면 컨텍스트의 인스턴스를 만들면 어떻게 될까요?

답변

2

컨텍스트는 사용자가 요청한 레코드 만로드하므로 처음 인스턴스를 만들 때 비어있는 상태가되고 말할 때까지 데이터베이스에 대해 쿼리를 수행하지 않습니다. 당신이 그것을 통해로드하는 엔티티는 (일반적으로) 컨텍스트 내에서 캐싱 될 것이므로 쿼리를 실행할 때마다 점점 더 많은 메모리를 사용하고 시간이 지남에 따라 매우 커질 수 있습니다.

컨텍스트가 인스턴스화하기에 상대적으로 저렴하므로 실제 필요로하는 동안 컨텍스트를 유지하는 것이 좋습니다. 완료되면 곧 처분하는 것이 좋습니다. 이것은 "작업 단위"패턴의 일부입니다. 기본적으로 하나의 단위 또는 트랜잭션으로 결합되는 각 작업 집합에 대해 새로운 컨텍스트를 사용합니다.

편집 추가 :

만약 당신이있어 수행하는 읽기 전용 쿼리 (당신은 단지 데이터를 표시 할 즉, 당신은 변경하고 데이터베이스에 다시 저장할 필요가 없습니다)을 추적하지 않는 검색어 (예 : DbContext/DbSet을 사용하는 경우 .AsNoTracking() 메소드, ObjectContext/ObjectSet을 사용하는 경우 MergeOption.NoTracking 속성)을 사용하면 결과를 컨텍스트에 캐시하지 않고 성능을 높일 수 있습니다 메모리 사용을 줄입니다.

+0

많은 도움을 주셔서 감사합니다. 코드가로드 될 때 페이지가 컨텍스트를 열 때 필요할 때 컨텍스트를 열 때만 코드를 변경해야하고 완료되면 다시 닫을 수 있습니다. 증서에 큰 맥락. 감사합니다. –

+0

실제로 페이지 요청 당 하나의 컨텍스트 - 그것을하는 꽤 일반적인 방법입니다. 처리량이 많지 않으면 일반적으로 문제가 없습니다. 그것은 약간의 메모리를 사용하지만, 반복되는 데이터베이스 쿼리를 피하는 것과 같은 이점을 가질 수 있으며, 어쨌든 모든 일이 꽤 빠르다. 실질적인 위험은 전체 응용 프로그램에 대해 하나의 컨텍스트를 공유하려고하면 (요청간에 지속되도록) - 심각하게 비대화되고 동시성 문제가 추가로 발생하며 메모리가 해제되지 않을 수 있습니다. –

+0

감사합니다. 관리자가 컨텍스트 추가 및 삭제 작업을 한 주 동안 저장되었습니다. –