Agrupamento de ligações no mssql-django

Este artigo explica como funciona o agrupamento de ligações em mssql-django e como configurá-lo para a sua aplicação Django.

Como funciona o pool de conexões

Por predefinição, mssql-django usa o agrupamento de ligações integrado do pyodbc. Quando uma ligação é encerrada pelo Django, o pyodbc devolve-a a um pool em vez de fechar a ligação ODBC subjacente. Pedidos de ligação subsequentes reutilizam ligações agrupadas, o que reduz a sobrecarga de estabelecer novas ligações à base de dados.

Configurar o agrupamento de conexões

O agrupamento de ligações é controlado pela definição DATABASE_CONNECTION_POOLING, que é definida ao nível do módulo em settings.py (fora do dicionário 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 pyodbc's connection pooling
DATABASE_CONNECTION_POOLING = False
Valor Comportamento
True (padrão) O agrupamento de ligações está ativado. As ligações fechadas são devolvidas à piscina.
False O agrupamento de ligações está desativado. Cada ligação é totalmente encerrada quando deixa de ser utilizada.

Quando desativar a agregação de ligações

Considere desativar o agrupamento de ligações nestes cenários:

  • Autenticação baseada em tokens: Ao usar tokens de acesso que expiram, as ligações agrupadas podem conter tokens obsoletos.
  • Resolução de problemas de ligação: Desativar o agrupamento de ligações simplifica a resolução de problemas, ao garantir que cada pedido cria uma nova ligação.
  • Processos de curta duração: Para scripts ou comandos de gestão que fazem algumas consultas e saem, o pooling não traz benefício.

Definições de retentativa de ligação

Independentemente da configuração de agrupamento, pode configurar o comportamento de repetição para tentativas de ligação sem êxito. Para a lista completa de opções de nova tentativa e de tempo limite, consulte Referência de configuração.

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

O Django também fornece uma CONN_MAX_AGE definição que controla quanto tempo o Django mantém uma ligação à base de dados aberta antes de a fechar. Esta configuração funciona em conjunto com o pool de ligações do 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",
        },
    },
}

Para mais informações sobre CONN_MAX_AGE, consulte a documentação das definições da base de dados Django.

Pontos práticos de partida:

  • CONN_MAX_AGE=0: mais seguro para depuração e trabalhos de curta duração.
  • CONN_MAX_AGE=600: bom padrão para muitas aplicações web.
  • CONN_MAX_AGE=3600: razoável para serviços estáveis de alto débito após testes de carga.

Note

Ao utilizar servidores ASGI (como o Daphne ou o Uvicorn) ou implementações com múltiplas threads, as conexões persistentes podem propagar-se entre contextos assíncronos. Se usares CONN_MAX_AGE com um servidor ASGI, define CONN_HEALTH_CHECKS = True (Django 4.1 e posteriores) e testa sob concorrência realista. Para mais informações, consulte a documentação Django sobre gestão de ligações.

CONN_HEALTH_CHECKS valida ligações agrupadas antes de ser reutilizada. Se Django detetar uma ligação obsoleta, abre transparentemente uma nova. Isto acrescenta um pequeno custo de verificação por cada pedido e vale normalmente a pena ativá-lo para processos de longa duração.