이 문서에서는 연결 풀링이 작동하는 mssql-django 방식과 Django 애플리케이션에 맞게 구성하는 방법을 설명합니다.
연결 풀링 작동 방식
기본적으로 mssql-django 드라이버 레벨 연결 풀링을 사용합니다. 기본 pyodbc 경로는 pyodbc 풀링을 사용하고, mssql-python 경로는 mssql-python 풀링을 사용합니다. Django가 연결을 닫으면, 활성 드라이버는 기본 데이터베이스 연결을 닫지 않고 이를 풀로 반환합니다. 후속 연결 요청은 풀링된 연결을 다시 사용하므로 새 데이터베이스 연결 설정의 오버헤드가 줄어듭니다. 드라이버 선택 세부 사항은 mssql-django의 데이터베이스 드라이버 선택을 참조하세요.
msodbcsql18 경로에서 기본 mssql-python 네이티브 제공자를 사용하면 드라이버가 재사용 전에 풀된 연결을 검증합니다. 검증 시 일시적인 네이티브 연결 작업 타임아웃을 적용하며, 양수 로그인 타임아웃이나 양수 값이 제공되지 않을 경우 15초 동안 사용합니다. 검증이 실패하면, 드라이버는 해당 연결을 폐기하고 모든 유휴 연결을 차례로 검증하는 대신 새로운 물리적 연결을 시도합니다. 여러 번의 검증 작업, 정리, 그리고 로그인 교체는 시간이 더 걸릴 수 있습니다. 이것은 완전한 검증이나 연결 체크아웃 시간 제한은 아닙니다. 연결을 풀에 반환하는 것은 체크아웃 검증 타임아웃에 제한되지 않습니다. 자세한 내용은 mssql-python 연결 풀링을 참조하세요.
미리보기 mssql-odbc 제공업체를 사용하도록 설정하기 전에 알려진 문제점을 검토하세요.
연결 풀링을 구성합니다
연결 풀링은 DATABASE_CONNECTION_POOLING의 모듈 수준에 배치된 settings.py 설정으로 제어되며(DATABASES 딕셔너리 외부), 다음과 같습니다:
DATABASES = {
"default": {
"ENGINE": "mssql",
"NAME": "<your-database>",
"USER": "<your-username>",
"PASSWORD": "<your-password>",
"HOST": "<your-server>",
"PORT": "1433",
"OPTIONS": {
"driver": "ODBC Driver 18 for SQL Server",
},
},
}
# Set to False to disable driver-level connection pooling
DATABASE_CONNECTION_POOLING = False
| 가치 | Behavior |
|---|---|
True(기본값) |
연결 풀링을 사용할 수 있습니다. 닫은 연결은 풀로 반환됩니다. |
False |
드라이버 레벨 연결 풀링은 비활성화되어 있습니다. pyodbc 경로는 Database.pooling=False를 설정하고, mssql-python 경로는 PoolingManager.disable()를 호출합니다. |
연결 풀링을 사용하지 않도록 설정하는 경우
다음 시나리오에서 연결 풀링을 사용하지 않도록 설정하는 것이 좋습니다.
- 토큰 기반 인증: 만료되는 액세스 토큰을 사용하는 경우 풀된 연결에 부실 토큰이 포함될 수 있습니다.
- 연결 문제 디버깅: 풀링을 사용하지 않도록 설정하면 각 요청이 새 연결을 만들도록 하여 문제 해결을 간소화합니다.
- 수명이 짧은 프로세스: 몇 가지 쿼리를 수행하고 종료하는 스크립트 또는 관리 명령의 경우 풀링이 이점을 추가하지 않습니다.
연결 다시 시도 설정
풀링 설정에 관계없이 실패한 연결 시도에 대한 재시도 동작을 구성할 수 있습니다. 재시도 및 시간 제한 옵션의 전체 목록은 구성 참조를 참조하세요.
DATABASES = {
"default": {
"ENGINE": "mssql",
"NAME": "<your-database>",
"USER": "<your-username>",
"PASSWORD": "<your-password>",
"HOST": "<your-server>",
"PORT": "1433",
"OPTIONS": {
"driver": "ODBC Driver 18 for SQL Server",
"connection_retries": 3,
"connection_retry_backoff_time": 10,
"connection_timeout": 30,
},
},
}
장고의 CONN_MAX_AGE
Django는 또한 Django를 닫기 전에 데이터베이스 연결을 열어 두는 기간을 제어하는 설정을 제공합니다 CONN_MAX_AGE . 이 설정은 운전자 수준의 연결 풀링과 함께 작동합니다:
DATABASES = {
"default": {
"ENGINE": "mssql",
"NAME": "<your-database>",
"USER": "<your-username>",
"PASSWORD": "<your-password>",
"HOST": "<your-server>",
"PORT": "1433",
"CONN_MAX_AGE": 600, # Keep connections open for 10 minutes
"OPTIONS": {
"driver": "ODBC Driver 18 for SQL Server",
},
},
}
자세한 CONN_MAX_AGE내용은 Django 데이터베이스 설정 설명서를 참조하세요.
실용적인 시작점:
-
CONN_MAX_AGE=0: 디버깅 및 수명이 짧은 작업에 가장 안전합니다. -
CONN_MAX_AGE=600: 많은 웹앱에 대한 좋은 기본값입니다. -
CONN_MAX_AGE=3600: 부하 테스트 후 안정적인 높은 처리량 서비스에 적합합니다.
메모
ASGI 서버(예: Daphne, Uvicorn)나 스레드 배포를 사용할 때, 지속적인 연결이 비동기 컨텍스트를 통해 누출될 수 있습니다.
CONN_MAX_AGE를 ASGI 서버와 함께 사용하는 경우, 지원되는 Django 버전에서는 CONN_HEALTH_CHECKS = True을 설정하고 실제와 유사한 동시성 환경에서 테스트하세요. 자세한 내용은 연결 관리에 대한 Django 설명서를 참조하세요.
CONN_HEALTH_CHECKS 다시 사용하기 전에 풀된 연결의 유효성을 검사합니다. Django가 부실 연결을 감지하면 새 연결이 투명하게 열립니다. 이렇게 하면 요청당 소규모의 검사 비용이 추가되지만, 장기간 실행되는 프로세스에는 일반적으로 활성화할 가치가 있습니다.