Pool di connessioni in mssql-django

Questo articolo illustra come funziona mssql-django il pool di connessioni e come configurarlo per l'applicazione Django.

Funzionamento del pool di connessioni

Per impostazione predefinita, mssql-django utilizza il pooling delle connessioni a livello di driver. Il percorso pyodbc predefinito utilizza il pooling pyodbc, mentre il percorso mssql-python utilizza il pooling mssql-python. Quando Django chiude una connessione, il driver attivo la restituisce a un pool invece di chiudere la connessione sottostante al database. Le richieste di connessione successive riutilizzano le connessioni in pool, riducendo il sovraccarico di stabilire nuove connessioni di database. Per i dettagli sulla selezione dei driver, vedi Seleziona il driver del database per mssql-django.

Configurare il pool di connessioni

Il pooling delle connessioni è controllato dall'impostazione DATABASE_CONNECTION_POOLING, che si trova a livello di modulo in settings.py (al di fuori del dizionario 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 (impostazione predefinita) Il pool di connessioni è abilitato. Le connessioni chiuse vengono restituite al pool.
False Il pooling di connessioni a livello di conducente è disabilitato. Il percorso pyodbc definisce Database.pooling=False, e il percorso mssql-python chiama PoolingManager.disable().

Quando disabilitare il pool di connessioni

Valutare la possibilità di disabilitare il pool di connessioni in questi scenari:

  • Autenticazione basata su token: quando si usano token di accesso che scadono, le connessioni in pool potrebbero contenere token non aggiornati.
  • Debug dei problemi di connessione: la disabilitazione del pooling delle connessioni semplifica la risoluzione dei problemi, poiché garantisce che ogni richiesta crei una nuova connessione.
  • Processi di breve durata: per gli script o i comandi di gestione che eseguono alcune query ed escono, il pooling non offre alcun vantaggio.

Impostazioni di ripetizione dei tentativi di connessione

Indipendentemente dall'impostazione del pool, è possibile configurare il comportamento di ripetizione dei tentativi per i tentativi di connessione non riusciti. Per l'elenco completo delle opzioni di ripetizione e timeout, vedere Informazioni di riferimento sulla configurazione.

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 di Django

Django fornisce anche un'impostazione CONN_MAX_AGE che controlla per quanto tempo Django mantiene aperta una connessione di database prima di chiuderla. Questa impostazione funziona in combinazione con il pooling delle connessioni a livello di driver:

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

Per altre informazioni su CONN_MAX_AGE, vedere la documentazione relativa alle impostazioni del database Django.

Punti di partenza pratici:

  • CONN_MAX_AGE=0: più sicuro per il debug e i processi di breve durata.
  • CONN_MAX_AGE=600: impostazione predefinita valida per molte app Web.
  • CONN_MAX_AGE=3600: ragionevole per servizi con elevata capacità di elaborazione continuativa dopo aver eseguito test di carico.

Note

Quando si utilizzano server ASGI (come Daphne o Uvicorn) o distribuzioni multithread, le connessioni persistenti possono propagarsi tra contesti asincroni. Se usi CONN_MAX_AGE con un server ASGI, imposta CONN_HEALTH_CHECKS = True le versioni supportate di Django e testa in concorrenza realistica. Per altre informazioni, vedere la documentazione di Django sulla gestione delle connessioni.

CONN_HEALTH_CHECKS convalida le connessioni in pool prima del riutilizzo. Se Django rileva una connessione non aggiornata, apre in modo trasparente una nuova connessione. In questo modo viene aggiunto un costo di verifica per richiesta ridotto e in genere vale la pena abilitare per i processi di lunga durata.