Nice programing

데이터 컨텍스트를 언제 폐기해야합니까?

nicepro 2021. 1. 7. 21:17
반응형

데이터 컨텍스트를 언제 폐기해야합니까?


현재 응용 프로그램에 대한 데이터 액세스 계층을 작성하고 있습니다. 액세스 계층은 linq 클래스를 광범위하게 사용하여 데이터를 반환합니다. 현재 데이터를 다시 데이터베이스에 반영하기 위해 개인 데이터 컨텍스트 멤버와 공용 저장 방법을 추가했습니다. 코드는 다음과 같습니다.

private DataContext myDb;
public static MyClass GetMyClassById(int id)
{
    DataContext db = new DataContext();
    MyClass result = (from item in db.MyClasss
                      where item.id == id
                      select item).Single();
    result.myDb = db;
    return result;
}

public void Save()
{
    db.SubmitChanges();
}

그것은 단순화에 대한 총체적이지만 일반적인 아이디어를 제공합니다. 그런 종류의 패턴을 처리하는 더 좋은 방법이 있습니까? db를 방문 할 때마다 새 데이터 컨텍스트를 인스턴스화해야합니까?


사실 그다지 중요하지 않습니다. 얼마 전에 LINQ to SQL 팀의 Matt Warren에게 이것에 대해 물었고, 여기에 대답이 있습니다.

IDisposable을 구현 한 몇 가지 이유가 있습니다.

응용 프로그램 논리가 DataContext가 사용되거나 유효 할 것으로 예상되는 시간 이후에 엔터티를 유지해야하는 경우 Dispose를 호출하여 해당 계약을 적용 할 수 있습니다. 해당 엔터티의 지연된 로더는 여전히 DataContext를 참조하며 코드가 지연된 속성을 탐색하려고 할 때이를 사용하려고합니다. 이러한 시도는 실패합니다. Dispose는 또한 DataContext가 구체화 된 엔티티의 캐시를 덤프하도록하여 단일 캐시 된 엔티티가 실수로 해당 DataContext를 통해 구체화 된 모든 엔티티를 유지하지 않도록합니다. 그렇지 않으면 메모리 누수로 보이는 원인이됩니다.

DataContext 연결을 자동으로 닫는 논리는 연결을 열어 두도록 속일 수 있습니다. DataContext는 결과 집합의 끝에 도달하면 연결이 닫히기 때문에 쿼리의 모든 결과를 열거하는 응용 프로그램 코드에 의존합니다. 응용 프로그램이 C # 또는 VB의 foreach 문 대신 IEnumerable의 MoveNext 메서드를 사용하는 경우 열거를 조기에 종료 할 수 있습니다. 애플리케이션에 연결이 닫히지 않는 문제가 발생하고 자동 닫기 동작이 작동하지 않는 것으로 의심되는 경우 Dispose 패턴을 해결 방법으로 사용할 수 있습니다.

그러나 기본적으로 당신이하지 않는 정말 디자인에 의한의 - 대부분의 경우 폐기해야합니다. 나는 개인적으로 그것을 예외의 부하를 기억하는 것보다 "구현으로 IDisposable 모든 것을 처분"의 규칙을 따라 쉽게로, 그래서 어쨌든 이렇게하는 것을 선호 - 당신 만있는 거 당신이 경우 리소스를 누출하지 않을 않는 처분하는 것을 잊지 그것.


데이터 컨텍스트를 리소스로 취급하십시오. 그리고 자원 사용 규칙에 따르면

"가능한 한 늦게 자원을 확보하고 안전한 한 빨리 해제하십시오"


DataContext는 매우 가볍고 사용중인 작업 단위 애플리케이션을위한 것입니다. 그러나 내 개체에 DataContext를 유지할 것이라고 생각하지 않습니다. 디자이너가 생성 한 코드를 사용하여 비즈니스 개체를 관리하지 않을 경우 저장소 패턴을 살펴볼 수 있습니다. 리포지토리 패턴을 사용하면 데이터 컨텍스트에서 분리 된 개체로 작업 한 다음 업데이트를 수행하기 전에 다시 연결할 수 있습니다.

개인적으로 저는 대부분의 경우 DBML 디자이너 생성 코드를 사용하여 비즈니스 및 유효성 검사 논리에 대한 부분적인 클래스 구현을 사용할 수 있습니다. 또한 디자이너가 생성 한 데이터 컨텍스트를 추상화하고이를 상속하여 데이터 컨텍스트에 직접 추가되는 저장 프로 시저 및 테이블 반환 함수 메서드와 같은 것을 가로 채서 여기에 비즈니스 논리를 적용 할 수 있도록합니다.

내가 ASP.NET MVC에서 사용한 패턴은 작업 단위에 필요한 적절한 데이터 컨텍스트를 만드는 팩토리 클래스를 삽입하는 것입니다. 팩토리를 사용하면 (1) 기존 데이터 컨텍스트 클래스 주위에 래퍼를 사용하여 모의 할 수 있도록 (DataContext는 쉽게 모의 할 수 없으므로 래퍼를 모의) (2) 가짜 / 모의 컨텍스트를 생성하여 데이터 컨텍스트를 합리적으로 쉽게 모의 할 수 있습니다. 그리고 그들을 창조하는 공장. 공장에서 마음대로 만들 수 있기 때문에 장시간 보관할 필요가 없습니다.

참조 URL : https://stackoverflow.com/questions/389822/when-should-i-dispose-of-a-data-context

반응형