이 문서에서는 연결 풀링이 작동하는 mssql-django 방식과 Django 애플리케이션에 맞게 구성하는 방법을 설명합니다.
연결 풀링 작동 방식
기본적으로 mssql-django pyodbc의 기본 제공 연결 풀링을 사용합니다. Django가 연결을 닫으면 pyodbc는 기본 ODBC 연결을 닫는 대신 이를 연결 풀로 반환합니다. 후속 연결 요청은 풀링된 연결을 다시 사용하므로 새 데이터베이스 연결 설정의 오버헤드가 줄어듭니다.
연결 풀링을 구성합니다
연결 풀링은 settings.py의 모듈 수준에 배치된 DATABASE_CONNECTION_POOLING 설정으로 제어되며(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 pyodbc's connection pooling
DATABASE_CONNECTION_POOLING = False
| 가치 | Behavior |
|---|---|
True(기본값) |
연결 풀링을 사용할 수 있습니다. 닫은 연결은 풀로 반환됩니다. |
False |
연결 풀링을 사용할 수 없습니다. 각 연결은 해제될 때 완전히 닫힙니다. |
연결 풀링을 사용하지 않도록 설정하는 경우
다음 시나리오에서 연결 풀링을 사용하지 않도록 설정하는 것이 좋습니다.
- 토큰 기반 인증: 만료되는 액세스 토큰을 사용하는 경우 풀된 연결에 부실 토큰이 포함될 수 있습니다.
- 연결 문제 디버깅: 풀링을 사용하지 않도록 설정하면 각 요청이 새 연결을 만들도록 하여 문제 해결을 간소화합니다.
- 수명이 짧은 프로세스: 몇 가지 쿼리를 수행하고 종료하는 스크립트 또는 관리 명령의 경우 풀링이 이점을 추가하지 않습니다.
연결 다시 시도 설정
풀링 설정에 관계없이 실패한 연결 시도에 대한 재시도 동작을 구성할 수 있습니다. 재시도 및 시간 제한 옵션의 전체 목록은 구성 참조를 참조하세요.
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 . 이 설정은 pyodbc의 연결 풀링과 함께 작동합니다.
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) 또는 스레드 배포를 사용하는 경우 비동기 컨텍스트에서 영구 연결이 누수될 수 있습니다. ASGI 서버와 함께 CONN_MAX_AGE를 사용하는 경우 CONN_HEALTH_CHECKS = True(Django 4.1 이상)를 설정하고, 실제와 유사한 동시성 환경에서 테스트하세요. 자세한 내용은 연결 관리에 대한 Django 설명서를 참조하세요.
CONN_HEALTH_CHECKS 다시 사용하기 전에 풀된 연결의 유효성을 검사합니다. Django가 부실 연결을 감지하면 새 연결이 투명하게 열립니다. 이렇게 하면 요청당 소규모의 검사 비용이 추가되지만, 장기간 실행되는 프로세스에는 일반적으로 활성화할 가치가 있습니다.