Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
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.