Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
W tym artykule wyjaśniono, jak działa mechanizm puli połączeń w mssql-django i jak skonfigurować go w aplikacji Django.
Jak działa buforowanie połączeń
Domyślnie mssql-django używa puli połączeń na poziomie sterownika. Domyślny wariant pyodbc korzysta z mechanizmu puli połączeń pyodbc, a wariant mssql-python korzysta z mechanizmu puli połączeń mssql-python. Gdy Django zamyka połączenie, aktywny sterownik zwraca je do puli zamiast zamykać podstawowe połączenie bazy danych. Kolejne żądania połączeń ponownie będą używać połączeń w puli, co zmniejsza obciążenie związane z nawiązywaniem nowych połączeń z bazą danych. Szczegóły wyboru sterownika można znaleźć w artykule Wybierz sterownik bazy danych dla mssql-django.
Na ścieżce mssql-python z domyślnym natywnym dostawcą msodbcsql18 sterownik weryfikuje połączenie z puli przed ponownym użyciem. Podczas walidacji stosuje tymczasowy natywny limit czasu operacji połączenia, stosując dodatni limit czasu logowania lub 15 sekund, gdy nie podano dodatniej wartości. Jeśli walidacja się nie powiedzie, sterownik odrzuca to połączenie i próbuje nawiązać nowe fizyczne połączenie zamiast weryfikować każde bezczynne połączenie kolejno. Wielokrotne operacje walidacyjne, czyszczenie i ponowne logowanie mogą wydłużyć czas. To nie jest pełny termin weryfikacji czy finalizacji połączenia. Zwrot połączenia do puli nie jest ograniczony limitem czasu walidacji przy pobieraniu połączenia. Więcej informacji można znaleźć w artykule mssql-python connection pooling.
Zanim zdecydujesz się na dostawcę w wersji zapoznawczej mssql-odbc, zapoznaj się ze znanymi problemami tego dostawcy.
Konfigurowanie puli połączeń
Pula połączeń jest kontrolowana przez ustawienie DATABASE_CONNECTION_POOLING, które znajduje się na poziomie modułu w settings.py (poza słownikiem 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
| Value | Behavior |
|---|---|
True (ustawienie domyślne) |
Włączono buforowanie połączeń. Zamknięte połączenia są zwracane do puli. |
False |
Pulowanie połączeń na poziomie sterownika jest wyłączone. Ścieżka pyodbc ustawia Database.pooling=False, a ścieżka mssql-python wywołuje PoolingManager.disable(). |
Kiedy wyłączyć pulowanie połączeń
Rozważ wyłączenie puli połączeń w następujących scenariuszach:
- Uwierzytelnianie oparte na tokenach: w przypadku używania tokenów dostępu, które wygasają, połączenia w puli mogą przechowywać nieaktualne tokeny.
- Debugowanie problemów z połączeniami: wyłączenie puli połączeń ułatwia rozwiązywanie problemów, ponieważ zapewnia, że każde żądanie tworzy nowe połączenie.
- Procesy krótkotrwałe: w przypadku skryptów lub poleceń zarządzania, które tworzą kilka zapytań i zakończą pracę, buforowanie nie przynosi korzyści.
Ustawienia ponawiania próby połączenia
Niezależnie od ustawienia puli połączeń można skonfigurować sposób ponawiania prób w przypadku nieudanych prób nawiązania połączenia. Aby uzyskać pełną listę opcji ponawiania i limitu czasu, zobacz Dokumentacja konfiguracji.
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 w Django
Django udostępnia CONN_MAX_AGE również ustawienie, które kontroluje, jak długo Django utrzymuje otwarte połączenie bazy danych przed jego zamknięciem. To ustawienie działa wraz z mechanizmem puli połączeń na poziomie sterownika:
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",
},
},
}
Aby uzyskać więcej informacji na temat CONN_MAX_AGEprogramu , zobacz dokumentację ustawień bazy danych Django.
Praktyczne punkty wyjścia:
-
CONN_MAX_AGE=0: najbezpieczniejsze w przypadku debugowania i krótkotrwałych zadań. -
CONN_MAX_AGE=600: dobra wartość domyślna dla wielu aplikacji internetowych. -
CONN_MAX_AGE=3600: odpowiednie w przypadku usług o stabilnie wysokiej przepustowości po przeprowadzeniu testów obciążeniowych.
Note
Gdy używasz serwerów ASGI (takich jak Daphne czy Uvicorn) lub wdrożeń wątkowych, trwałe połączenia mogą przeciekać w kontekstach asynchronicznych. Jeśli używasz CONN_MAX_AGE z serwerem ASGI, ustaw CONN_HEALTH_CHECKS = True w obsługiwanych wersjach Django i przetestuj działanie w warunkach realistycznej współbieżności. Aby uzyskać więcej informacji, zobacz dokumentację platformy Django dotyczącą zarządzania połączeniami.
CONN_HEALTH_CHECKS Sprawdza poprawność połączeń w puli przed ponownym użyciem. Jeśli usługa Django wykryje nieaktualne połączenie, w przezroczysty sposób otwiera nowe połączenie. Spowoduje to dodanie niewielkiego kosztu sprawdzania poszczególnych żądań i zwykle jest warte włączenia w przypadku długotrwałych procesów.