2014-09-04 2 views
2

(공유) SQL Server 데이터베이스를 사용하여 ASP.NET 4.5에서 실행되는 사이트가 있습니다. 우리 ISP는 최근 우리에게 개방 된 연결이 너무 많아서 서버의 전반적인 안정성에 영향을주고 있다고 말했습니다. 로드가 많은 경우이 숫자는 사이트를 방문하는 약 200 명의 동시 사용자와 400 개 이상의 연결을 열 수 있습니다.엔터티 프레임 워크 연결 열기

사이트는 주로 리뷰 및 블로그 게시물과 같은 콘텐츠로 이루어져 있으며 사이트 전체에서 캐싱을 구현했습니다. 우리는 Entity Framework를 독점적으로 사용하여 데이터베이스를 쿼리합니다. 우리는 StructureMap을 사용하여 연결 문자열을 비즈니스 로직 클래스에 삽입합니다.

StructureMap 초기화 ​​: 우리의 서비스에서 다음

var ecsbuilder = new EntityConnectionStringBuilder(); 
ecsbuilder.Provider = "System.Data.SqlClient"; 
ecsbuilder.ProviderConnectionString = @"data source=***;initial catalog=***;persist security info=True;User ID=***;Password=***;multipleactiveresultsets=True;App=EntityFramework"; 
ecsbuilder.Metadata = @"res://*/Data.***.csdl|res://*/Data.***.ssdl|res://*/Data.***.msl"; 
string connectionString = ecsbuilder.ToString(); 
For<SiteModelContainer>().Use<SiteModelContainer>().Ctor<string>("connectionString").Is(connectionString); 
For<IGalleryService>().Use<GalleryService>(); 
...all the rest of our services 

(예 GalleryService) 우리는 다음과 같은 한 : 우리의 서비스 방법에서

private readonly SiteModelContainer _context; 

public GalleryService(SiteModelContainer context) 
{ 
    this._context = context; 
} 

우리가 데이터베이스

을 조회 할 수 _context를 사용 제 질문은 다음과 같습니다 :

  1. 이것이 우리가 데이터베이스를 쿼리하는 유일한 방법이라면 어떤 이유로 연결을 닫지 않는 것입니까?
  2. 연결이 열려있는 위치를 결정하는 데 사용할 수있는 방법은 무엇입니까?

주셔서 감사합니다 연결 문자열에

+0

이 또한 내가 문을 "사용"을 사용하지만 연결이 유출 된 곳에서 찾을 수 없습니다 비록 나에게 일어났다. – Mairaj

+0

연결 풀링이 도움이됩니다. 가능한 경우 캐싱 계획을 재 작업하는 것을 고려할 수도 있습니다. 제대로 수행되면 캐싱은 상당한 양의 백엔드 호출을 db에 대해 제거 할 수 있어야합니다. –

+0

@MairajAhmad StructureMap이 컨텍스트를 자동으로 삭제한다는 인상하에 있었습니까? – Peuge

답변

0
  1. 를 사용하여 연결 풀링.
  2. 다음과 같이 컨텍스트를 사용하기 위해 블록을 사용하십시오.

    // 컨텍스트를 얻을 수있는 클래스와 정적 함수를 만듭니다

    public class DaatabaseFramework 
    { 
        public static SiteModelContainer GetContext() 
        { 
         return new SiteModelContainer(); 
        } 
    } 
    

    // 컨텍스트

    using (var context=DaatabaseFramework.GetContext()) 
    { 
    
    } 
    
0

내가하려고 할 때 비슷한 볼 수 있었다에게 사용하기 위해 아래의 사용 (... 연결 ...) {} 블록에서 IQueryable 변수를 전달하십시오.

이렇게하면 고아가 된 연결이 내 사이트에 머물러있게됩니다.

다음과 같은 코드를 찾아보십시오 :

public IQueryable<YourClass> func(int param1) { 
    using(var context=DaatabaseFramework.GetContext()) { 
    return context.MyTable.Where(_=>_.Param1==Param1); 
    } 
}