2014-12-17 3 views
3

질문에 대한 C# 모범 사례.핸들 연결/쿼리에 대한 모범 사례

클래스 실행 루프 :

for(Object x in objects) //5000 
{ 
    nonStaticObject.callThisMethod(x.id); 
} 

DAL 층 :

ReturnObject x = null; 
using(SQLConnection...) 
{ 
    using(SQLCommand...) 
    { 
     // run something here 
     // if found, instantiate object x 
    } 
} 
나는 5000 개체 이상 반복하고 그 객체 각각에 대해 백 엔드로 전화를 만드는 클래스가

내 코드 (루프에 대한 병렬)에서 생성 된 일부 높은 CPU로 인해 프로파일 링을했는데 핫스팟이 데이터베이스에 대한 모든 호출 (및 올바를 정도로) 인 것처럼 보입니다. 그리고 이러한 전화는 매우 빈번하기 때문에 몇 가지 질문이있었습니다.

제 생각에는 가능한 경우 연결을 다시 사용해야한다는 것입니다. 그게 최선의 관행인가? 코드에서 연결 처분 (키워드 사용)을 처리하도록 허용하려면 모든 5000 통화에 사용할 수있는이 전략으로 어떻게 효과적으로 연결을 설정해야합니까? 내가 지금처럼 그 메소드에 대한 모든 호출을 연결해야하나요? (나는 어딘가에 ADO 연결 풀이 자동으로 연결을 재사용한다는 것을 읽었는데, 이것은 아마도 백그라운드에서 이미 수행 된 것일까?). 데이터베이스 연결에 대한 도움이 보통

+0

실제 호출은 DB입니까? 아니면 근처의 일부 코드입니까? 한 쪽에서 .NET 프로필러를 사용한 다음 SQL 프로필러를 사용하여 결과를 비교하십시오. 내 경험에 비추어 볼 때 DB를 사용할 때 결과를 기다리는 데 가장 많은 시간이 소요됩니다. 그래서 여러 쿼리를 하나로 결합하는 데 도움이됩니다. – Neolisk

+0

SQL 프로파일 러는 걱정하지 않습니다. 자리에있는 색인은 효과적이고 빠릅니다. 내가 만든 연결의 수가 너무 많아서 그런 것 같아? 모든 5000은 30 초 안에 처리되므로 짧은 순서로 5000 건의 연결 요청이 발생합니다 (문제가있는 경우). – user2124871

+0

연결을 자주 해제 할 필요는 없습니다. 당신이 그들을 사용하는 한, 당신은 그것을 열어 놓을 수 있습니다. 연결이 아니라 거래로 생각해야합니다. 그러나이 문제는 반복 자체에있을 수 있습니다. 나는 여전히 위의 코드가 코드와 어떤 관련이 있는지 파악할 수 없다. – rodrigogq

답변

4

,에 대한

덕분에, 정책은 가능한 늦게 개방하고 가능한 한 빨리 닫아야합니다. 그래서 실행할 쿼리/쿼리 하나가 있다면 쿼리를 실행하기 전에 연결을 연 후 연결을 닫습니다.

그러나의 경우 루프에서 5000 개의 쿼리를 실행 중이므로 연결을 5000 회 열고 닫을 시점이 없습니다. 대신 단일 연결을 사용하고 모든 쿼리를 실행하십시오.

또한 열기 및 닫기 연결은 .Net 연결 풀에 대한 연결을 반환합니다. 이미 열린 연결이있는 경우 Conn.Open();을 사용하여 연결을 열면이 연결 풀에서 열린 연결 인 을 반환합니다. 참조 : SQL Server Connection Pooling (ADO.NET)Creating database connections - Do it once or for each query?

+0

제 경우에는 DB에 요청을 생성하는 메서드를 사용하는 DAL 개체가있는 곳에서 5000 풀 호출 전에 연결 풀링을 사용하려면 어떻게해야합니까? 일반적으로, using() {...} 프로세스를 사용하여이 작업을 허용합니다 (현재 설정에서는 할 수 없다고 생각됩니다).그리고 고맙습니다. 대답 : – user2124871

+0

@ user2124871, DAL의 메소드에 콜렉션을 전달하고,'using' 문과 그 안에있는 연결을 가지고 루프를 실행하십시오. 따라서 각 항목에 대해 동일한 연결이 사용됩니다. – Habib

+1

그게 내가 생각한거야. 팁을 주셔서 다시 한번 감사드립니다. – user2124871