Groepsgewijze verbindingen in mssql-django

In mssql-django dit artikel wordt uitgelegd hoe groepsgewijze verbindingen werken en hoe u deze configureert voor uw Django-toepassing.

Hoe groepsgewijze verbindingen werken

mssql-django Standaard wordt gebruikgemaakt van de ingebouwde verbindingspooling van pyodbc. Wanneer een verbinding wordt gesloten door Django, retourneert pyodbc deze naar een pool in plaats van de onderliggende ODBC-verbinding te sluiten. Volgende verbindingsaanvragen hergebruiken gegroepeerde verbindingen, waardoor de overhead van het tot stand brengen van nieuwe databaseverbindingen wordt verminderd.

Groepsgewijze verbindingen configureren

Groepsgewijze verbindingen worden beheerd door de DATABASE_CONNECTION_POOLING instelling, die op moduleniveau settings.py wordt geplaatst (buiten de DATABASES woordenlijst):

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
Waarde Gedrag
True (standaard) Pooling van verbindingen is ingeschakeld. Gesloten verbindingen worden teruggeplaatst in de pool.
False Groepsgewijze verbindingen is uitgeschakeld. Elke verbinding is volledig gesloten wanneer deze wordt vrijgegeven.

Wanneer moet u groepsgewijze verbindingen uitschakelen

Overweeg om groepsgewijze verbindingen uit te schakelen in deze scenario's:

  • Verificatie op basis van tokens: wanneer u toegangstokens gebruikt die verlopen, kunnen poolverbindingen verouderde tokens bevatten.
  • Foutopsporing van verbindingsproblemen: het uitschakelen van pooling vereenvoudigt het oplossen van problemen door ervoor te zorgen dat elke aanvraag een nieuwe verbinding maakt.
  • Kortdurende processen: Voor scripts of beheeropdrachten die een paar query's maken en afsluiten, voegt pooling geen voordeel toe.

Instellingen voor opnieuw proberen van verbinding

Ongeacht de pooling-instelling kunt u het nieuwepogingsgedrag voor mislukte verbindingspogingen configureren. Zie Configuratieverwijzing voor de volledige lijst met opties voor opnieuw proberen en time-outs.

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,
        },
    },
}

Django's CONN_MAX_AGE

Django biedt ook een CONN_MAX_AGE instelling waarmee wordt bepaald hoelang Django een databaseverbinding openhoudt voordat deze wordt gesloten. Deze instelling werkt samen met de verbindingspooling van 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",
        },
    },
}

Zie de CONN_MAX_AGE voor meer informatie.

Praktische uitgangspunten:

  • CONN_MAX_AGE=0: veiligst voor foutopsporing en kortstondige taken.
  • CONN_MAX_AGE=600: goede standaardinstelling voor veel web-apps.
  • CONN_MAX_AGE=3600: redelijk voor stabiele services met hoge doorvoer na belastingstests.

Note

Wanneer u ASGI-servers (zoals Daphne of Uvicorn) of threaded-implementaties gebruikt, kunnen permanente verbindingen over asynchrone contexten lekken. Als u CONN_MAX_AGE met een ASGI-server gebruikt, stel CONN_HEALTH_CHECKS = True in (Django 4.1 en later) en test onder realistische gelijktijdige belasting. Zie de Django-documentatie over verbindingsbeheer voor meer informatie.

CONN_HEALTH_CHECKS valideert gegroepeerde verbindingen voordat ze opnieuw worden gebruikt. Als Django een verouderde verbinding detecteert, wordt er transparant een nieuwe geopend. Dit voegt een kleine extra controlekost per aanvraag toe en is meestal de moeite waard om in te schakelen voor langdurige processen.