대부분의 경우 연결 풀링 문제는 "연결 누출"과 관련이 있습니다. 응용 프로그램이 데이터베이스 연결을 정확하고 일관되게 닫지 않을 수 있습니다. 연결을 열린 상태로두면 .NET 가비지 수집기가 해당 Finalize()
메서드 를 호출하여 연결을 닫을 때까지 차단 된 상태로 유지됩니다 .
연결을 실제로 닫고 있는지 확인하려고 합니다 . 코드의 경우, 예를 들어 다음의 코드는, 연결 누수가 발생할 .Open
그리고 Close
예외를 발생 :
var connection = new SqlConnection(connectionString);
connection.Open();
// some code
connection.Close();
올바른 방법은 다음과 같습니다.
var connection = new SqlConnection(ConnectionString);
try
{
connection.Open();
someCall (connection);
}
finally
{
connection.Close();
}
또는
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
someCall(connection);
}
함수 가 클래스 메서드에서 연결을 반환 하면 로컬로 캐시하고 Close
메서드를 호출해야 합니다. 예를 들어이 코드를 사용하여 연결이 누출됩니다.
var command = new OleDbCommand(someUpdateQuery, getConnection());
result = command.ExecuteNonQuery();
connection().Close();
첫 번째 호출에서 반환 된 연결 getConnection()
이 닫히지 않았습니다. 연결을 닫는 대신이 줄은 새로운 연결을 만들어 닫으려고합니다.
또는를 사용 SqlDataReader
하는 OleDbDataReader
경우 닫습니다. 연결 자체를 닫는 것이 속임수 인 것처럼 보이지만 데이터 리더 개체를 사용할 때 명시 적으로 닫으려면 추가 노력을 기울이십시오.
MSDN / SQL Magazine 의이 기사 " 연결 풀 오버플로는 왜 발생합니까? "에서 많은 세부 사항을 설명하고 몇 가지 디버깅 전략을 제안합니다.
sp_who
또는을 실행하십시오 sp_who2
. 이 시스템 저장 프로시 저는sysprocesses
시스템 테이블 모든 작업 프로세스의 상태와 정보를 표시하는 합니다. 일반적으로 연결 당 하나의 서버 프로세스 ID (SPID)가 표시됩니다. 연결 문자열에서 응용 프로그램 이름 인수를 사용하여 연결의 이름을 지정한 경우 작동중인 연결을 쉽게 찾을 수 있습니다.
- SQLProfiler
TSQL_Replay
템플릿 과 함께 SQL Server 프로파일 러를 사용하여 열린 연결을 추적하십시오. Profiler에 익숙한 경우 sp_who를 사용하여 폴링하는 것보다이 방법이 더 쉽습니다.
- 풀과 연결을 모니터링하려면 성능 모니터를 사용하십시오. 이 방법에 대해서는 잠시 후에 설명하겠습니다.
- 코드에서 성능 카운터를 모니터링합니다. 루틴을 사용하여 카운터를 추출하거나 새로운 .NET PerformanceCounter 컨트롤을 사용하여 연결 풀의 상태와 설정된 연결 수를 모니터링 할 수 있습니다.