Quão ruim está abrindo e fechando uma conexão SQL por várias vezes? Qual é o efeito exato?
-
05-07-2019 - |
Pergunta
Por exemplo, eu preciso preencher muitos dados de dados com o método de preenchimento () de sqldataadapter:
DataAdapter1.Fill(DataTable1);
DataAdapter2.Fill(DataTable2);
DataAdapter3.Fill(DataTable3);
DataAdapter4.Fill(DataTable4);
DataAdapter5.Fill(DataTable5);
....
....
Mesmo todos os objetos DataAdapter usam o mesmo SQLConnection, cada método de preenchimento abrirá e fechará a conexão, a menos que o estado de conexão já esteja aberto antes da chamada do método.
O que eu quero saber é como a abertura e fechamento desnecessariamente de sqlConnections afeta o desempenho do aplicativo. Quanto ele precisa escalar para ver os efeitos ruins desse problema (100.000 de usuários simultâneos?). Em um site de tamanho médio (diariamente 50000 usuários), vale a pena se preocupar e pesquisar todas as chamadas de preenchimento (), mantendo-as juntas no código e abrindo a conexão antes de qualquer chamada de preenchimento () e fechar depois?
Solução
O ADO.NET possui pool de conexões, por exemplo, quando você fecha uma conexão, ele não está realmente completamente fechado, mas "reciclado" se você pedir uma nova conexão com exatamente a mesma string de conexão.
No entanto - se você já conhecer Antes do tempo que você terá que chamar esses cinco métodos de preenchimento um por um, eu definitivamente recomendaria
- abrindo a conexão
- Lendo todas as cinco tabelas de dados do banco de dados
- Fechando a conexão novamente imediatamente
É aceito prática recomendada dessa maneira, não machuca você - então faça isso! :-)
Marc
PS: O pool de conexões no ADO.net, é claro, funciona apenas se você não desligá -lo! :-) está por padrão - você teria que desativá -lo explicitamente.
Outras dicas
Ponto chave:
Por que abrir, manter e reutilizar conexões?
atuação
Há muitas razões pelas quais você pode abrir e fechar conexões. Você tem que decidir onde está a melhor troca para sua usar. Você pode fazer as duas coisas: use uma conexão aberta por um período de tempo e/ou um número definido de transações, feche -a e abra uma nova.
Abrir e fechar conexões SQL é caro Quando comparado a outras tarefas simples no banco de dados. Mas se sua A tarefa real já está demorada, a sobrecarga extra não pode ser notada (se você já está escondendo o período de espera da tarefa real - para que o usuário não comece a clicar aleatoriamente em coisas - como tentar novamente).
Caso de teste:
Você pode medir sua diferença escrevendo duas versões de uma consulta de teste. Selecione qualquer tarefa simples SQL (precisa ser o mesmo em cada versão).
Na versão 1, faça isso com uma única conexão aberta constante fora O loop, loop através da sua tarefa simples x número de vezes.
No segundo, faça isso com a abertura e o fechamento da conexão lado de dentro o laço.
Altere o número X de vezes para combinar sua uso e expectativas. Isso deve dar a você uma sensação muito boa do impacto em sua sistema.
Espero que ajude você a entender o básico ... Jack.
Resposta Necro: A melhor maneira é colocar a conexão em uma declaração 'usando' para que seja escopo para o trabalho necessário:
using (SqlConnection conn = new SqlConnection())
{
DataAdapter1.Fill(DataTable1);
DataAdapter2.Fill(DataTable2);
DataAdapter3.Fill(DataTable3);
DataAdapter4.Fill(DataTable4);
DataAdapter5.Fill(DataTable5);
...
...
}