2017-11-09 13 views
1
 using (var db1 = new DataBase1Entities()) 
     { 
      using (var db2 = new DataBase2Entities()) 
      { 
       var list = (from obj in db2.Table1 
          where !db1.Table2.Any(i => i.Table2Col == obj.Table1Col) 
          select obj).ToList(); 
      } 
     } 

누군가가 하나의 데이터베이스 테이블에서 값을 검색하고 다른 데이터베이스 테이블과 비교하는 방법을 알고 있습니까? 위의 코드가 올 바르면 성능 문제가 발생합니까?중첩 된 사용 문은 성능에 영향을 미칩니다.

+2

중첩 된 '사용'은 여러 개의 'IDisposable'을 사용하는 일반적인 패턴입니다. – Sinatr

+1

성능에 영향을주는 것은 '사용'이 아니라 자원 할당/해제입니다. 다른 리소스를 소비하는 프로세스는 db1에서 데이터를 검색하고 db2와 비교하여 " –

+1

"성능에 영향을 미치는 코드를 'using' - "코드 내부의 코드와 비교하여 무엇입니까? 분명히 * 코드를 가지고 * 실행할 시간이 걸릴 것입니다 *. ** 여기서 정확하게 질문은 무엇입니까? ** –

답변

4

너는 모른다. what a using-statement does. 실제로 그것은 try-finally-block 이외의 아무것도 아니며 결국 Dispose에 대한 호출이 있습니다. 그래서 코드는 다음에 번역 :

DataBase1Entities db1 = null; 
try 
{ 
    db1 = new DataBase1Entities(); 
    DataBase1Entities db2 = null; 
    try 
    { 
     db2 = new DataBase2Entities() 
     // do something with db2 
    } 
    finally 
    { 
     if(db2 != null) db2.Dispose(); } 
    } 
} 
finally 
{ 
    if(db1 != null) db1.Dispose(); 
} 

그래서 키우면되지 않았거나 성능에 영향을주지 않을 수도 있습니다 using하지만 Dispose. 그러나 으로 전화하여 Dispose으로 전화해야합니다. 그렇게하지 않는 것은 정말 나쁜 생각입니다. 특히 성능 문제로 인해 완료된 경우. Dispose은 관리되지 않는 리소스를 해제합니다. 파일 핸들러. 만약 당신이 그것을 부르지 않는다면 아마도 메모리 누수를 일으킬 자원을 공개 할 방법이 없을 것입니다.

+0

이것이 왜 왜곡 된 이유를 알 수 있습니까? – HimBromBeere

+1

모르겠지만 나에게서 +1. – john

+0

둘 중 어느 것도 모릅니다. –

1

원한다면 확실히 중첩을 제거 할 수 있습니다. (테스트되지 않은) 무언가 :

HashSet<YourType> bob; 

using (var db1 = new DataBase1Entities()) 
{ 
    bob = new HashSet<YourType>(db1.Table2.Select(z => z.Table2Col); 
} 

using (var db2 = new DataBase2Entities()) 
{ 
    var list = (from obj in db2.Table1 
       where !bob.Contains(obj.Table1Col) 
       select obj).ToList(); 
} 

더 빠른지 확인하려면 프로필을 작성해야합니다. 중첩 된 사용을 제거하기보다는 속도 향상의 많은 부분이있을 경우 HashSet을 사용하기 때문일 수 있습니다.