Por que é uma prática negativa para fazer várias conexões de banco de dados em um único pedido?

StackOverflow https://stackoverflow.com/questions/28590

Pergunta

Uma discussão sobre gestações únicas em PHP tem-me pensar sobre esse problema, mais e mais.A maioria das pessoas instruir que você não deve fazer um monte de conexões a banco de dados em um único pedido, e eu só estou curioso para saber o que seu raciocínio é.Meu primeiro pensamento é a despesa para seu script de fazer com que muitas solicitações para o DB, mas então eu counter-me com a pergunta:não iria várias conexões simultâneas de consulta mais eficiente?

Como sobre algumas respostas (provas, gente) de algumas pessoas que a conhecem?

Foi útil?

Solução

Conexões de banco de dados são um recurso limitado.Alguns DBs é muito baixo limite de conexão, e o desperdício de conexões é um grande problema.Por consumir muitas ligações, você pode estar bloqueando outros para utilizar a base de dados.

Além disso, jogar uma tonelada de extras conexões ao banco de dados não ajuda nada, a menos que haja recursos no servidor de banco de dados ocioso.Se você tem 8 núcleos e apenas um está sendo usado para satisfazer uma consulta, então com certeza, fazer outra conexão pode ajudar.Mais provável, porém, você já está usando todos os núcleos disponíveis.Também é provável que bater na mesma unidade de disco rígido para cada pedido po, e adicionando a contenção de bloqueio.

Se seu banco de dados tem nada parecido com alta utilização, a adição extra de conexões não ajuda.Que seria como a desova extra threads numa aplicação com a esperança cega de que o adicional de simultaneidade vai tornar o processamento mais rápido.Ele pode em algumas determinadas circunstâncias, mas em outros casos, ele só vai te atrapalhar como você thrash a unidade de disco rígido, o desperdício de tempo de troca de tarefas, e introduzir a sincronização de sobrecarga.

Outras dicas

É o custo de configurar a conexão, transferência de dados e, em seguida, rasgar para baixo.Ele vai comer até o seu desempenho.

A prova é mais difícil de encontrar, mas considere o seguinte...

Vamos dizer que ele tem x microssegundos para fazer uma conexão.

Agora, pretende fazer vários pedidos e obter dados e para trás.Digamos que a diferença no tempo de transporte é negligable entre uma conexão e muitos (apenas rlo fins de argumentação).

Agora vamos dizer que é preciso y microssegundos para fechar a ligação.

A abertura de uma conexão levará x+y microssegundos de sobrecarga.A abertura de muitos vai tomar n * (x+y).Que irá atrasar a sua execução.

Configurar uma conexão do DB é, normalmente, bastante pesado.Um monte de coisas que estão acontecendo nos bastidores DNS (resolução/conexão TCP/Handshake de Autenticação//Consulta Real).

Eu tive um problema uma vez com algum estranho DNS configuração de cada conexão TCP levou alguns segundos antes de subir.Meu procedimento de início de sessão (devido a uma complexa arquitetura) levou 3 diferentes conexões a banco de dados para concluir.Com essa questão, ele estava tomando para sempre iniciar a sessão.Nós, então, reformulado o código para torná-lo ir através de uma ligação só.

Nós acesso do Informix .NET e usar várias conexões.A menos que nós estamos iniciando uma transação em cada ligação, muitas vezes, é tratada no pool de conexão.Eu sei que é muito específica da marca, mas a maioria(?) sistemas de banco de dados' cilent acesso pool de conexões com o melhor de sua capacidade.

Como um aparte, tivemos um problema com a contagem de conexão por causa da cruz de conexões de banco de dados.Informix suporta sinônimos, então nós synonymed comum infratores e múltiplas conexões foram tratados no lado do servidor, economizando muito no tempo de transferência de dados, ligação a criação de sobrecarga, e (o verdadeiro ponto crucial da nossa situação) taxas de licença.

Eu diria que é porque seus pedidos não estão sendo enviadas de forma assíncrona, uma vez que os pedidos são feitos de forma iterativa no servidor, de bloqueio, de cada vez, você tem que pagar para a sobrecarga de criação de uma conexão de cada vez, quando você só precisa fazer isso uma vez...

No Flex, todas as chamadas de serviço da web são automaticamente chamado de forma assíncrona, de forma que é comum ver várias ligações, ou na fila de pedidos na mesma conexão.

Solicitações assíncronas mitigar o custo de conexão mais rapidamente do pedido / tempo de resposta porque você não pode... facilmente conseguir isso em PHP sem alguns threading, em seguida, a perda de desempenho é maior, em seguida, simplesmente reutilizar a mesma conexão.

que meus 2 centavos...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top