1. Connection Pooling이란?

  • Connection Pooling은 데이터베이스 연결을 효율적으로 관리하기 위한 방법입니다.
  • DB 연결은 클라이언트와 서버 간의 핸드셰이크, 로그인 등으로 시간이 소요되므로, 기존의 연결을 유지하고 재활용하여 성능을 향상시킵니다.
  • ADO.NET에서는 Connection Pooling이 기본적으로 활성화(ON) 되어 있으며, 이를 통해 연결 작업의 비용을 줄입니다.

2. Connection Pooling의 동작 원리

  1. 연결 생성:
    • 클라이언트가 SqlConnection 객체를 생성하고 Open()을 호출하면, 새로운 연결이 생성되고 Connection Pool에 추가됩니다.
    • SQL 서버에는 이를 나타내는 SPID(Session Process ID)가 생성됩니다.
  2. 연결 재활용:
    • 연결이 닫혀도(Connection Close) Pool에 반환되어 대기 상태로 유지됩니다.
    • 새로운 연결 요청이 발생하면 Pool에서 기존 연결을 재사용합니다.
  3. Pool 크기 관리:
    • 최소 연결 수(Min Pool Size): Pool에 유지될 최소 연결 수.
    • 최대 연결 수(Max Pool Size): Pool에 저장될 최대 연결 수. 기본값은 100입니다.
    • 필요 시 Pool 크기를 동적으로 조정하여 리소스를 관리합니다.
  4. Timeout 관리:
    • 연결 요청이 Queue에서 대기할 수 있는 최대 시간(Connection Timeout). 기본값은 15초입니다.
    • Timeout 안에 연결을 확보하지 못하면 예외가 발생합니다.

3. Connection Pool 생성 기준

  • Connection String:
    • 동일한 Connection String을 사용하는 경우 같은 Pool을 공유합니다.
    • Connection String이 조금이라도 다르거나, 옵션 순서가 다르면 별도의 Pool이 생성됩니다.
  • 인증 방식:
    • Windows Authentication: 사용자 계정별로 별도의 Pool이 생성됩니다.
    • SQL Authentication: 공통 Pool을 사용하여 성능이 더 좋습니다.
  • 프로세스와 AppDomain:
    • 프로세스와 AppDomain이 다르면 별도의 Pool이 생성됩니다.

4. Connection Pool 옵션

Connection String에서 설정 가능한 주요 옵션:

옵션설명기본값

Pooling Connection Pooling 활성화 여부. true로 설정 시 활성화. true
Min Pool Size Pool에서 유지할 최소 연결 수. 1
Max Pool Size Pool에서 유지할 최대 연결 수. 100
Connection Timeout 연결 요청 대기 시간. 초 단위로 설정. 15
Enlist 현재 트랜잭션 컨텍스트에 연결을 자동 등록할지 여부. true

예제 Connection String

string connectionString = "Data Source=MyServer;Initial Catalog=MyDB;Integrated Security=true;" +
                          "Min Pool Size=20;Max Pool Size=100;Connection Timeout=15;Pooling=true;";

5. Connection Pool 관리

  • Pool 초기화:
    • SqlConnection.ClearAllPools()를 호출하면 모든 Connection Pool이 초기화되고 연결이 닫힙니다.
    • 사용하지 않는 연결은 자동으로 제거되어 SQL 서버 부하를 줄입니다.

사용 예제

using (SqlConnection conn = new SqlConnection(connectionString))
{
    conn.Open();
    // 데이터베이스 작업 수행
    conn.Close(); // 연결은 Pool로 반환
}
SqlConnection.ClearAllPools(); // Pool 초기화

6. Connection Pool 성능 관리

  • 적절한 Pool 크기 설정:
    • 최소 Pool 크기(Min Pool Size)를 설정하면 서버가 항상 준비된 연결을 유지하므로 대기 시간이 줄어듭니다.
    • 최대 Pool 크기(Max Pool Size)를 통해 과도한 리소스 사용을 제한합니다.
  • Connection String 최적화:
    • 통일된 Connection String을 사용하여 불필요한 Pool 생성을 방지합니다.
  • Idle Timeout:
    • 사용하지 않는 연결은 일정 시간 후 제거됩니다. 이 시간을 관리하여 리소스를 최적화할 수 있습니다.

7. Connection Pool 모니터링

  • SQL Server SPID 확인:
    • SQL Server에서 sys.dm_exec_sessions 및 sys.dm_exec_requests를 사용하여 Pool에 연결된 세션(SPID)을 확인할 수 있습니다.
    SELECT * FROM sys.dm_exec_sessions WHERE is_user_process = 1;
  • ADO.NET 성능 카운터:
    • .NET 성능 카운터를 통해 Pool 상태를 모니터링할 수 있습니다.
    • 사용 가능한 연결 수:
       
      .NET Data Provider for SqlServer -> NumberOfPooledConnections

+ Recent posts