1. Connection Pooling이란?
- Connection Pooling은 데이터베이스 연결을 효율적으로 관리하기 위한 방법입니다.
- DB 연결은 클라이언트와 서버 간의 핸드셰이크, 로그인 등으로 시간이 소요되므로, 기존의 연결을 유지하고 재활용하여 성능을 향상시킵니다.
- ADO.NET에서는 Connection Pooling이 기본적으로 활성화(ON) 되어 있으며, 이를 통해 연결 작업의 비용을 줄입니다.
2. Connection Pooling의 동작 원리
- 연결 생성:
- 클라이언트가 SqlConnection 객체를 생성하고 Open()을 호출하면, 새로운 연결이 생성되고 Connection Pool에 추가됩니다.
- SQL 서버에는 이를 나타내는 SPID(Session Process ID)가 생성됩니다.
- 연결 재활용:
- 연결이 닫혀도(Connection Close) Pool에 반환되어 대기 상태로 유지됩니다.
- 새로운 연결 요청이 발생하면 Pool에서 기존 연결을 재사용합니다.
- Pool 크기 관리:
- 최소 연결 수(Min Pool Size): Pool에 유지될 최소 연결 수.
- 최대 연결 수(Max Pool Size): Pool에 저장될 최대 연결 수. 기본값은 100입니다.
- 필요 시 Pool 크기를 동적으로 조정하여 리소스를 관리합니다.
- 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
'소프트웨어 개발 및 시스템 프로그래밍 > 데이터베이스' 카테고리의 다른 글
데이터베이스 데이터 유형 및 CHAR와 VARCHAR의 차이점 (3) | 2024.12.14 |
---|---|
MySQL Monitor 사용법 (0) | 2024.12.14 |
[SQL] CREATE TABLE 테이블 생성, 제약조건(CONSTRAINT), 확인(DESC) (0) | 2024.12.14 |
데이터베이스 개념 (2) | 2024.12.13 |