Anslutningspoolning i mssql-django

Den här artikeln förklarar hur anslutningspooler fungerar i mssql-django och hur du konfigurerar den för ditt Django-program.

Så här fungerar anslutningspooler

Som standard mssql-django använder den anslutningspooling på drivrutinsnivå. Standardsökvägen för pyodbc använder pyodbc-anslutningspoolning, och mssql-python-sökvägen använder mssql-python-anslutningspoolning. När Django stänger en anslutning returnerar den aktiva drivrutinen den till en pool istället för att stänga den underliggande databasanslutningen. Efterföljande anslutningsbegäranden återanvänder poolanslutningar, vilket minskar kostnaderna för att upprätta nya databasanslutningar. För detaljer om drivrutinsval, se Välj databasdrivrutinen för mssql-django.

Konfigurera anslutningspooler

Anslutningspoolen styrs av inställningen DATABASE_CONNECTION_POOLING som placeras på modulnivå i settings.py (utanför DATABASES ordlistan):

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
Värde Behavior
True (standardinställning) Anslutningspoolning är aktiverad. Stängda anslutningar returneras till poolen.
False Anslutningspoolning på drivrutinsnivå är inaktiverad. Pyodbc-vägen sätter Database.pooling=False, och mssql-python-vägen anropar PoolingManager.disable().

När du ska inaktivera anslutningspooler

Överväg att inaktivera anslutningspooler i följande scenarier:

  • Tokenbaserad autentisering: När du använder åtkomsttoken som upphör att gälla kan poolanslutningar innehålla inaktuella token.
  • Felsökning av anslutningsproblem: Om du inaktiverar pooler förenklas felsökningen genom att säkerställa att varje begäran skapar en ny anslutning.
  • Kortvariga processer: För skript eller hanteringskommandon som gör några frågor och avslutar lägger poolning inte till någon fördel.

Inställningar för återförsök av anslutning

Oavsett poolinställningen kan du konfigurera beteende för återförsök för misslyckade anslutningsförsök. Den fullständiga listan över alternativ för återförsök och tidsgränser finns i Konfigurationsreferens.

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

Djangos CONN_MAX_AGE

Django innehåller också en CONN_MAX_AGE inställning som styr hur länge Django håller en databasanslutning öppen innan den stängs. Denna inställning fungerar tillsammans med anslutningspooling på drivrutinsnivå:

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

Mer information om CONN_MAX_AGEfinns i dokumentationen för Django-databasinställningar.

Praktiska utgångspunkter:

  • CONN_MAX_AGE=0: säkrast för felsökning och kortvariga jobb.
  • CONN_MAX_AGE=600: bra standard för många webbappar.
  • CONN_MAX_AGE=3600: rimligt för stadiga tjänster med högt dataflöde efter belastningstestning.

Note

När du använder ASGI-servrar (som Daphne eller Uvicorn) eller trådade distributioner kan persistenta anslutningar läcka över asynkrona sammanhang. Om du använder CONN_MAX_AGE med en ASGI-server, ställ CONN_HEALTH_CHECKS = True in stödda Django-versioner och testa under realistisk samtidighet. Mer information finns i Django-dokumentationen om anslutningshantering.

CONN_HEALTH_CHECKS verifierar poolanslutningar innan de återanvänds. Om Django identifierar en inaktuell anslutning öppnar den transparent en ny. Detta lägger till en liten kontrollkostnad per begäran och är vanligtvis värt att aktivera för långvariga processer.