Buforowanie połączeń w mssql-django

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.