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.
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.