4

Castler Windsor IoC를 사용하여 웹 요청별로 Linq2SQL datacontext를 만드는 ASP.NET MVC 앱이 있습니다.Linq to SQL DataContext Windsor IoC 메모리 누수 문제

내가 완전히 이해하지 못하는 몇 가지 이유 때문에 새로운 datacontext가 (모든 웹 요청에서) 생성 될 때마다 약 8KB의 메모리가 사용되지 않고 릴리스되지 않아 필연적으로 OutOfMemory 예외가 발생합니다.

강제로 가비지 수집을하면 메모리가 해제됩니다.

내 데이터 컨텍스트 클래스는 매우 간단합니다 :

<component id="DataContextAccessor" 
      service="DomainModel.Repositories.IDataContextAccessor, DomainModel" 
      type="DomainModel.Repositories.DataContextAccessor, DomainModel" 
      lifestyle="PerWebRequest">  
    <parameters> 
     <connectionString> 
     ... 
     </connectionString> 
    </parameters> 
    </component> 

사람이 문제가 무엇인지 알고 있나요, 어떻게 그것을 해결하기 위해 :

public class DataContextAccessor : IDataContextAccessor 
{ 
    private readonly DataContext dataContext; 
    public DataContextAccessor(string connectionString) 
    { 
     dataContext = new DataContext(connectionString);   
    } 
    public DataContext DataContext { get { return dataContext; } } 
} 

윈저의 IoC webconfig

이 지금과 같은 인스턴스화?

+1

참조 : http://stackoverflow.com/questions/85183/windsor-container-how-to-force-dispose-of-an-object http://stackoverflow.com/questions/132940/why-does- 성 윈드 서스 홀드 투 트랜지언트 오브젝트 –

답변

3

queen3이 올바른지, 당신의 DataContextAccessor 클래스는 IDisposable를 구현하고 .Dispose() 방법에서 datacontext.Dispose()를 호출 할 필요가있다. (면책 조항 : 나는 성 윈저와 함께 일하지 않았습니다.)

는 다른 방법으로, 내가 무엇을 할 것이라고하는 설정입니다 유일한 당신이 (예를 들어, GetContext()) 메서드를 호출 할 때 DataContext 생성하는 DataContextFactory,에 DataContextAccessor. 그럼 당신은이 작업을 수행 할 수 있습니다

using(DataContext context = myDataContextFactory.GetContext()) { 
    // Do whatever you want with the context 
} 
// Context is disposed here 

당신은이 앞의 질문에서 살펴 봐야 할 수 있습니다 How do you reconcile IDisposable and IoC?

4

아니 당신의 DataContextAccessorIDisposable를 구현할 필요는 없습니다. Windsor는 수업을 수정하지 않고도 케이스를 처리 할 수있을만큼 똑똑합니다.

그러나 다른 답변에서 설명한 바와 같이 DataContext이이를 구현하고 있기 때문에 Windsor가보고 그것을 정리하여 등록합니다 (Dispose 메서드 호출).

당신이해야 할 일은 container.Release으로 전화하고 루트 서비스를 전달하는 것입니다 (귀하의 경우에는 DataContextAccessor 일 것입니다). 윈저는 그 파일과 모든 의존성을 해제 할 것이고 (DisposeDataContext이라고도 부른다) 메모리가 해제 될 것이다.

ASP.NET MVC를 사용하는 경우 구성 요소 릴리스를 처리하는 Windsor 통합이있는 MVCContrib 프로젝트를 사용하는 것이 좋습니다.

1

@ Krzysztof Koźmic이 맞다고 생각합니다. 당신은 윈저에서 무엇이든 공개해야합니다.

윈저는 IDisposable에 익숙한 누구에게나 꽤 외계인입니다. 이러한 명백한 불일치의 원인은 구성 요소의 수명주기 관리에 있습니다.Windsor에서 IDisposable 인 구성 요소를 가져온 경우 해당 인스턴스가 일시적으로 구성되어 있는지 싱글 톤으로 구성되어 있는지 알 수 없습니다 (물론 앱이 발전함에 따라 변경 될 수 있음).

구성 요소를 처분하고 나중에 싱글 톤으로 판명되면 다른 클라이언트 코드가 구성 요소가 갑자기 왜 실패했는지 궁금해하게됩니다! 윈저만이 처분 결정을 내릴 수 있습니다.

멋진 블로그 게시물 르지 (나 링크를 게시하지 않습니다!)

를 우리의 응용 프로그램에서 우리는 싱글의 커플에서 떨어져, 모든 과도했습니다. Transient는 가장 단순한 모델 인 것처럼 보입니다 (모든 사람들이 'Dispose보다는 Release'해야 함을 이해하는 한). 테스트에 모의 컨테이너가있는 경우 모의가 해결하는 각 구성 요소에 대해 Release가 호출 될 것이라는 기대를 설정할 수 있으며 일시적으로 다른 모드보다 성능 문제가 적은 것으로 들었습니까? 이 코드는 확실히 이식성이 좋습니다.

적어도 마지막으로, 당신은 메모리 누수가 있고 WINDBG http://blogs.msdn.com/b/tess/archive/2008/04/03/net-debugging-demos-lab-7-memory-leak-review.aspx에 뭔가가 GC에 의해 수집되지 않는 이유는, 테스 Ferrandez '팹 튜토리얼 시리즈를 체크 아웃 무엇을 작동해야하는 경우 ... 범인 예상치 못한 어딘가에있을 수 있습니다!