답변:
쿼리 / 트랜잭션 당 하나를 만들면 연결 "닫기"를 관리하는 것이 훨씬 쉽습니다.
상식에 따라 열어서 사용해야한다는 이유를 알 수 있지만 연결 끊기와 멀티 스레딩에 문제가 발생할 수 있습니다. 따라서 다음 단계는 풀을 열고 (예 : 50 개) 연결을 모두 열어 두어 다른 프로세스에 할당하는 것입니다. 그리고 이것이 .NET 프레임 워크가 이미 당신을 위해하는 것임을 알게 될 것 입니다.
필요할 때 연결을 열고 처리가 끝났을 때 처리하면 연결이 실제로 닫히지 않고 연결 풀로 돌아가서 다시 사용할 수 있습니다.
쿼리마다 하나의 연결을 만드는 것이 가장 좋습니다. 데이터를 표시하는 경우 필요한 모든 데이터를 한 번에 가져 오는 것이 좋습니다 .
배경 정보:
.NET에서 호출 SqlConnection.Open()
은 기본적으로 항상 연결 풀링을 투명하게 사용 합니다 ( MSDN의 "SQL Server에서 연결 풀링 사용" 참조 ). 따라서을 사용하여 새 연결을 가져 와서 완료되면 Open()
호출 Close()
하면 .NET이 올바른 작업을 수행합니다.
연결 풀링이 없으면 실제 데이터베이스 연결을 만드는 데 비용이 많이 들며 (인증, 네트워크 오버 헤드 등) 일반적으로 동시 연결 수는 매우 제한적이기 때문에 쿼리 당 하나의 연결은 매우 나쁜 생각입니다.
SqlConnection.Open()
은 항상 연결 풀링을 투명하게 사용합니다. 따라서 "연결 열기"와 "풀에서 연결 검색"의 차이점은 없습니다. 내 오해 나는 질문에 대한 약간의 설명을 자유롭게 편집하고 투표권을 되찾았다.
이 모든 것이 .Net 생태계의 맥락에 있음을 기억하십시오.
개발자는 때때로 연결 객체를 재사용하기 위해 코드를 "최적화"하기를 원합니다. 이 질문의 맥락에서 볼 때 이것은 거의 항상 실수입니다.
ADO.Net에는 연결 풀링 이라는 기능이 있습니다. 새 연결 개체를 만들고 열 때 실제로 수행하는 작업은 풀에서 연결을 요청하는 것입니다. 연결을 닫으면 풀로 돌아갑니다.
코드에서 직접 사용하는 개체를 이해하는 것이 중요합니다. SqlConnection, MySqlConnection, OleDbConnectio 등은 모두 ADO.Net에서 관리하는 실제 기본 연결을 래퍼 로 묶고 ADO.Net 실제 연결은 훨씬 "무겁고"더 비쌉니다. 성능 관점에서. 인증, 네트워크 전송, 암호화와 같은 문제가있는 기본 개체이며 실제 코드에서 실제로 볼 수있는 개체의 메모리 양보다 훨씬 큽니다.
연결 개체를 재사용하려고하면 ADO.Net이 중요한 기본 연결을 효과적으로 관리 할 수 없게됩니다. 훨씬 더 큰 것을 희생시키면서 작은 것에서 효율성을 얻습니다.
응용 프로그램 또는 http 요청에서 연결을 다시 사용하면 실수로 병렬로 실행될 수있는 것을 직렬화하여 성능 병목 현상이 발생할 수 있습니다. 실제 응용 프로그램에서 발생하는 것을 보았습니다.
적어도 하나의 http 요청 / 응답 기간 동안 최소한의 연결 만 유지하는 웹 페이지 예의 경우 요청 파이프 라인에서 실행하는 쿼리를 평가하여 더 많은 효율성을 얻을 수 있습니다. 가능한 한 데이터베이스에 대한 별도의 요청이 적습니다 (단일 : 단일 SQL 문자열로 둘 이상의 쿼리를 제출하고 DataReader.NextResult()
서로 다른 테이블을 사용 하거나 확인 DataSet
하여 이들 사이를 이동할 수 있습니다).
다시 말해, 응용 프로그램 또는 http 요청에 대해 하나의 연결을 다시 사용하는 것과 쿼리 당 하나의 연결을 다시 사용한다는 점을 고려하기보다는 데이터베이스를 호출 할 때마다 매 라운드마다 하나의 연결을 고려하십시오. 그런 다음 트립 수를 최소화하여 연결 수를 최소화하십시오. 이런 식으로 두 목표를 모두 만족시킬 수 있습니다.
그러나 그것은 한 종류의 최적화 일뿐입니다. 또한 프로그래머 시간을 최적화하고 효과적인 코드 재사용을 얻고 있습니다. 개발자는 열려 있고 바로 사용할 수있는 연결 개체를 얻기 위해 동일한 상용구 코드를 반복해서 작성하고 싶지 않습니다. 지루할뿐만 아니라 프로그램에 버그를 도입하는 방법이기도합니다.
그럼에도 불구하고 일반적으로 쿼리 (또는 왕복) 당 하나의 연결을 갖는 것이 좋습니다. 동일한 상용구 코드를 다시 쓰지 않도록하기 위해 사용할 수있는 다른 패턴이 있습니다. 여기 제가 좋아하는 한 가지 예가 있지만 다른 것들도 많이 있습니다.