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 utiliza agrupamento de ligações ao nível do driver. O caminho pyodbc padrão usa pooling pyodbc, e o caminho mssql-python usa pooling mssql-python. Quando o Django fecha uma ligação, o driver ativo devolve-a a um pool em vez de fechar a ligação subjacente à base de dados. Pedidos de ligação subsequentes reutilizam ligações agrupadas, o que reduz a sobrecarga de estabelecer novas ligações à base de dados. Para detalhes sobre a seleção de drivers, consulte Selecionar o driver da base de dados para mssql-django.

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 driver-level 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 ao nível do driver está desativado. O caminho pyodbc define Database.pooling=False, e o caminho mssql-python chama PoolingManager.disable().

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 definição funciona em conjunto com o pool de ligações do controlador:

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

Quando usas servidores ASGI (como Daphne ou Uvicorn) ou implantações em threads, as ligações persistentes podem infiltrar-se em contextos assíncronos. Se usares CONN_MAX_AGE com um servidor ASGI, define CONN_HEALTH_CHECKS = True nas versões do Django suportadas e testa em condições realistas de concorrência. 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.