질문에 대한 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 연결 풀이 자동으로 연결을 재사용한다는 것을 읽었는데, 이것은 아마도 백그라운드에서 이미 수행 된 것일까?). 데이터베이스 연결에 대한 도움이 보통
실제 호출은 DB입니까? 아니면 근처의 일부 코드입니까? 한 쪽에서 .NET 프로필러를 사용한 다음 SQL 프로필러를 사용하여 결과를 비교하십시오. 내 경험에 비추어 볼 때 DB를 사용할 때 결과를 기다리는 데 가장 많은 시간이 소요됩니다. 그래서 여러 쿼리를 하나로 결합하는 데 도움이됩니다. – Neolisk
SQL 프로파일 러는 걱정하지 않습니다. 자리에있는 색인은 효과적이고 빠릅니다. 내가 만든 연결의 수가 너무 많아서 그런 것 같아? 모든 5000은 30 초 안에 처리되므로 짧은 순서로 5000 건의 연결 요청이 발생합니다 (문제가있는 경우). – user2124871
연결을 자주 해제 할 필요는 없습니다. 당신이 그들을 사용하는 한, 당신은 그것을 열어 놓을 수 있습니다. 연결이 아니라 거래로 생각해야합니다. 그러나이 문제는 반복 자체에있을 수 있습니다. 나는 여전히 위의 코드가 코드와 어떤 관련이 있는지 파악할 수 없다. – rodrigogq