2014-08-28 3 views
6

을 만드는 다시 대를 엽니 DB 문맥을 떠나 내가 아주 간단한 윈폼 /이 엔티티 프레임 워크 (V6) 프로그램 :엔티티 프레임 워크 - 지속적으로

  1. 는 폼 요소 사용자가 클릭하면
  2. 를 채울 수있는 데이터베이스를 조회, 관련 정보를 그 정보에
  3. 수행합니다 계산을 얻기 위해 데이터베이스를-은 쿼리 재 사용자

EF에서 초보자이기로 표시 나는 '일의 예를 따르도록 노력했습니다 온라인을 발견했습니다과의 라인을 따라 조회 /를 채우는 매우 간단 뭔가 올라와있다 :

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    Using ctx As New MyEntities 
      <Query DB to populate initial values for first combobox> 
    End Using 
End Sub 

Private Sub cboVal1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cboVal1.SelectedIndexChanged 
    Using ctx As New MyEntities 
     <Queries to populate the other controls based upon user selections> 
    End Using 
End Sub 

Private Sub Button_Press(sender As Object, e As EventArgs) Handles MyButton.Click 
    Using ctx As New MyEntities 
     <Queries to get data, based upon user selections for calculations> 
    End Using 
End Sub 

내가 발견하고있어 보이는 부분은 내 프로그램의 속도를 느리게 할 수 있다는 점이다 (그리고 나는이에 대한 틀렸다면 정정 해줘 제발 - 내가 말했듯이, 나는 초보자 오전 내가있어하는 새로운 DB 연결을 내가 사용할 때마다 다시 설정)을 내 코드에서

Using ctx As New MyEntities 
    ... 
End Using 

을 .

그래서, 내가 생각하고있는 것은 폼 레벨 변수를 갖는 것이다. ctx as MyEntities - 폼로드시 커넥션을 닫고 폼 클로저에서 커넥션을 닫고 같은 것을 계속 사용하기 위해 의 라인 :

Dim ctx as MyEntities 

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    ctx = New MyEntities 

    <Query ctx to populate initial values for first combobox> 
End Sub 

Private Sub cboVal1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cboVal1.SelectedIndexChanged 
    <Queries ctx to populate the other controls based upon user selections> 
End Sub 

Private Sub Button_Press(sender As Object, e As EventArgs) Handles MyButton.Click 
    <Queries ctx to get data, based upon user selections for calculations> 
End Sub 

Private Sub Main_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing 
    ctx.Dispose() 
    ctx = Nothing 
End Sub 

나는이 방식으로 작동하는 것을 전환, 극적으로 증가 속도를 갖고있는 것 같아요, 나는 그것이 가능성이 DB에 나쁜 변경의 가능성에 나를 열어 둡니다 것을 알고 있어요,하지만 이것은 어떤 업데이트도하지 않는 작은 프로젝트입니다. 그냥 쿼리하는 것입니다 ... 합리적인 해결책입니까, 아니면 일을하는 것이 위험한 방법입니까?

+1

일반적으로 작업 단위에서 DBContext를 사용해야합니다. 그렇지 않으면 데이터가 DB 컨텍스트 캐시 엔티티처럼 부실해질 수 있습니다. 동일한 쿼리를 두 번 수행하면 DB에 한 번만 기록됩니다. 나는 광범위하게 EF를 사용해 왔지만 이러한 방식으로 컨텍스트를 사용하면 비용이 많이 든다는 것을 결코 발견하지 못했습니다. 나는 당신의 경기 침체가 어디 있는지 좀 더 조사 할 것입니다. –

+1

클래스를 상속하는 DBContext를 재 작성하는 데 많은 비용이 소요되는지 궁금합니다. repo의 각 함수가 DBContext의 자체 인스턴스를 사용하기 전에 저장소를 설정했습니다. 거기에 어떤 문제가있는 것 같지 않았지만, 다시 애플 리케이션은 매우 데이터 집약적 인 아니었다. EF로 작업 단위 패턴을 구현하는 방법에 대해서는이 기사를 참조하십시오 : http : //www.asp.net/mvc/tutorials/getting-started-with-ef-5-using-mvc-4/asp-net-mvc-application에서 저장소 및 작업 단위 패턴 구현 – erdinger

+1

로드 한 데이터를 변경할 필요가없고 데이터베이스에 다시 쓰지 않아도된다면 컨텍스트의 변경 추적을 해제해야합니다 (ctx.Configuration.AutoDetectChanges = false). 이것은 눈에 띄는 성능 향상을 가져다 줄 것입니다. –

답변

5

데이터베이스 연결은 일반적으로 모든 최신 쿼리 도구로 연결 풀에 풀링됩니다. 이것은 스레드 풀과 매우 비슷하게 보입니다. 어떤 수의 연결이 열리고 새로운 컨텍스트가 만들어지고 연결을 요청할 때마다 기존 연결 중 하나를 독점적으로 사용하게됩니다. 컨텍스트가 삭제되면 연결이 닫히지 않고 연결 풀로 반환됩니다.

이 때문에 장시간 수동으로 컨텍스트를 유지하려고 할 필요가 없습니다. 단 한 번의 조작으로 이들을 사용하십시오.

물론 연결 풀링을 명시 적으로 수행하지 않으려는 경우 연결 풀링을 사용하지 않을 수 있지만 그럴 가능성은 거의 없습니다.

+0

감사합니다, Servy !!!! - 이해하기를, 당신이 말하는 것은 내 첫 번째 colution이 내가 그 연결이 완전히 열려 있고 응용 프로그램이 끝날 때까지 풀에 보관되어 있기 때문에 내가 생각했던 것만 큼 * 전혀 비용이 들지 않는다는 것이다. 그게 정확히? –