.net - 오라클 - sqlconnection pooling




엔터티 프레임 워크 및 연결 풀링 (3)

최근에 .NET 4.0 응용 프로그램에서 Entity Framework 4.0을 사용하기 시작했으며 풀링과 관련된 몇 가지 사항에 대해 궁금합니다.

  1. 필자가 알고있는 연결 풀링은 ADO.NET 데이터 공급자가 관리합니다. 내 경우에는 MS SQL 서버의 경우입니다. 이것은 새로운 엔티티 컨텍스트 ( ObjectContext ), 즉 매개 변수없는 new MyDatabaseModelEntities() 를 인스턴스화 할 때 적용됩니까?

  2. a) 응용 프로그램에 대한 전역 엔티티 컨텍스트 (즉, 하나의 정적 인스턴스)를 작성하거나 b) using 블록을 using 각 조작 / 메소드에 대한 엔티티 컨텍스트를 작성하고 노출하는 장점과 단점은 무엇입니까?

  3. 내가 알아야 할 특정 시나리오에 대한 다른 권장 사항, 모범 사례 또는 일반적인 방법은 무엇입니까?


  1. 연결 풀링은 다른 ADO.NET 응용 프로그램과 마찬가지로 처리됩니다. 엔터티 연결은 기존의 데이터베이스 연결과 기존의 연결 문자열을 계속 사용합니다. 연결 문자열에서 연결 풀링을 해제 할 수 있다고 생각합니다. 사용하지 않으려는 경우입니다. ( SQL Server 연결 풀링 (ADO.NET) 에 대한 추가 정보)
  2. 결코 글로벌 컨텍스트를 사용하지 마십시오. ObjectContext는 내부적으로 아이덴티티 맵 (Identity Map)과 작업 단위 (UOW Unit)를 포함한 몇 가지 패턴을 구현합니다. 글로벌 컨텍스트 사용의 영향은 응용 프로그램 유형별로 다릅니다.
  3. 웹 응용 프로그램의 경우 요청 당 단일 컨텍스트를 사용하십시오. 웹 서비스의 경우 호출 당 단일 컨텍스트를 사용하십시오. WinForms 또는 WPF 응용 프로그램에서는 양식 또는 발표자별로 단일 컨텍스트를 사용하십시오. 이 접근 방식을 사용할 수없는 몇 가지 특별한 요구 사항이있을 수 있지만 대부분의 경우이 정도면 충분합니다.

WPF / WinForm 응용 프로그램에 대한 단일 객체 컨텍스트가 어떤 영향을 미치는지 알고 싶다면이 article 확인 article . 그것은 NHibernate Session에 관한 것이지만 그 아이디어는 같습니다.

편집하다:

EF를 사용할 때 기본적으로 컨텍스트마다 각 엔티티를 한 번만로드합니다. 첫 번째 쿼리는 엔티티 인스턴스를 만들어 내부적으로 저장합니다. 동일한 키를 가진 엔티티를 요구하는 후속 u 리는이 저장된 인스턴스를 리턴합니다. 데이터 저장소의 값이 변경되면 초기 쿼리의 값이있는 엔티티가 계속 수신됩니다. 이를 ID 맵 패턴 이라고합니다. 엔티티를 다시로드하도록 오브젝트 컨텍스트를 강제 실행할 수 있지만 단일 공유 인스턴스를 다시로드합니다.

엔터티에 대한 모든 변경 내용은 컨텍스트에서 SaveChanges 를 호출 할 때까지 유지되지 않습니다. 여러 엔티티에서 변경을 수행하고이를 한 번에 저장할 수 있습니다. 이를 작업 단위 패턴 이라고합니다. 저장된 수정 된 엔티티를 선택적으로 말할 수는 없습니다.

이 두 패턴을 결합하면 흥미로운 효과가 나타납니다. 전체 애플리케이션에 대해 하나의 엔티티 인스턴스 만 있습니다. 엔티티에 대한 모든 변경 사항은 변경 사항이 아직 지속되지 않더라도 (커밋 됨) 전체 응용 프로그램에 영향을줍니다. 대부분의 시간에 이것은 당신이 원하는 것이 아닙니다. WPF 응용 프로그램에서 편집 양식이 있다고 가정합니다. 엔티티와 함께 ​​작업하고 복잡한 편집 (값 변경, 관련 엔티티 추가, 다른 관련 엔티티 제거 등)을 취소하기로 결정했습니다. 그러나 엔티티는 이미 공유 된 환경에서 수정됩니다. 너는 무엇을 할 것인가? 힌트 : ObjectContext CancelChanges 또는 UndoChanges에 대해 알지 못합니다.

우리는 서버 시나리오에 관해서 논의 할 필요가 없다고 생각합니다. 여러 HTTP 요청 또는 웹 서비스 호출간에 단일 엔티티를 공유하기 만하면 응용 프로그램이 쓸모 없게됩니다. 모든 요청은 SaveChanges 트리거 할 수 있으며 모든 요청간에 단일 작업 단위를 공유하기 때문에 다른 요청의 부분 데이터를 저장할 수 있습니다. 또한 문맥에있는 문맥과 엔티티 조작이나 문맥에 의해 사용 된 데이터베이스 연결은 쓰레드에 안전하지 않다.

읽기 전용 응용 프로그램의 경우에도 응용 프로그램을 쿼리 할 때마다 항상 신선한 데이터를 원하기 때문에 전역 컨텍스트는 좋은 선택이 아닙니다.


EF6 (4,5 기타) 문서에 대한 내용 : https://msdn.microsoft.com/en-us/data/hh949853#9

9.3 요청 당 컨텍스트

Entity Framework의 컨텍스트는 최적의 성능 환경을 제공하기 위해 수명이 짧은 인스턴스로 사용됩니다 . 컨텍스트는 수명이 짧고 폐기 될 것으로 예상되므로 가능한 경우 매우 가볍고 메타 데이터를 다시 사용하도록 구현되었습니다. 웹 시나리오에서는이를 염두에 두어야하며 단일 요청 기간보다 많은 상황을 고려하지 않아야합니다. 마찬가지로 웹이 아닌 시나리오에서는 Entity Framework에서 다양한 수준의 캐싱에 대한 이해를 기반으로 컨텍스트를 삭제해야합니다. 일반적으로 말해, 애플리케이션의 수명 내내 문맥 인스턴스는 물론, thread 및 정적 문맥 당 문맥을 가지는 것을 피해야합니다.


아래 코드는 내 객체가 새로운 데이터베이스 값으로 새로 고침되는 것을 도왔다. Entry (object) .Reload () 명령은 개체가 데이터베이스 값을 다시 호출하도록합니다.

GM_MEMBERS member = DatabaseObjectContext.GM_MEMBERS.FirstOrDefault(p => p.Username == username && p.ApplicationName == this.ApplicationName);
DatabaseObjectContext.Entry(member).Reload();






connection-pooling