Pergunta

Estou usando a camada PDO do PHP para acesso a dados em um projeto, e tenho lido sobre ela e visto que ela tem um bom suporte inato para conexões persistentes de banco de dados.Estou me perguntando quando/se devo usá-los.Eu veria benefícios de desempenho em um aplicativo com muito CRUD?Existem desvantagens a serem consideradas, talvez relacionadas à segurança?

Se for importante para você, estou usando o MySQL 5.x.

Foi útil?

Solução

Você poderia usar isso como um "conjunto de regras" aproximado:

SIM, use conexões persistentes, se:

  • Existem apenas alguns aplicativos/usuários acessando o banco de dados, ou seja,você não resultará em 200 conexões abertas (mas provavelmente ociosas), porque há 200 usuários diferentes compartilhados no mesmo host.
  • O banco de dados está sendo executado em outro servidor que você está acessando pela rede
  • Um (um) aplicativo acessa o banco de dados com muita frequência

NÃO, não use conexões persistentes se:

  • Seu aplicativo só precisa acessar o banco de dados 100 vezes por hora.
  • Você tem muitos servidores web acessando um servidor de banco de dados
  • Você está usando o Apache no modo pré-fork.Ele usa uma conexão para cada processo filho, o que pode aumentar rapidamente.(via @Powerlord nos comentários)

Usar conexões persistentes é consideravelmente mais rápido, especialmente se você estiver acessando o banco de dados através de uma rede.Não faz muita diferença se o banco de dados estiver rodando na mesma máquina, mas ainda é um pouco mais rápido.Porém - como o nome já diz - a conexão é persistente, ou seja,permanece aberto, mesmo que não seja usado.

O problema é que na "configuração padrão", o MySQL permite apenas 1000 "canais abertos" paralelos.Depois disso, novas conexões serão recusadas (você pode ajustar esta configuração).Portanto, se você tiver - digamos - 20 servidores Web com 100 clientes cada, e cada um deles tiver apenas um acesso à página por hora, a matemática simples mostrará que você precisará de 2.000 conexões paralelas ao banco de dados.Isso não vai funcionar.

Portanto:Use-o apenas para aplicativos com muitas solicitações.

Outras dicas

Em resumo, minha experiência diz que conexões persistentes devem ser evitadas tanto quanto possível.

Observe que mysql_close é uma operação sem operação (no-op) para conexões criadas usando mysql_pconnect.Isso significa que a conexão persistente não pode ser fechada pelo cliente à vontade.Essa conexão será fechada pelo servidor mysqldb quando nenhuma atividade ocorrer na conexão por mais de wait_timeout.Se wait_timeout é um valor grande (digamos 30 min), então o servidor mysql db pode facilmente alcançar max_connections limite.Nesse caso, o banco de dados mysql não aceitará nenhuma solicitação de conexão futura. É quando o seu pager começa a apitar.

Para evitar chegar max_connections limite, o uso de conexão persistente precisa de um equilíbrio cuidadoso das seguintes variáveis...

  1. Número de processos Apache em um host
  2. Número total de hosts executando o Apache
  3. variável wait_timout no servidor mysql db
  4. variável max_connections no servidor mysql db
  5. Número de solicitações atendidas por um processo Apache antes de ele ser gerado novamente

Portanto, use conexão persistente após bastante deliberação.Talvez você não queira criar problemas complexos de tempo de execução para obter um pequeno ganho obtido com uma conexão persistente.

Criar conexões com o banco de dados é uma operação bastante cara.Conexões persistentes são uma boa ideia.No mundo ASP.Net e Java, temos "pooling de conexões", que é praticamente a mesma coisa, e também uma boa ideia.

IMO, a verdadeira resposta a esta pergunta é o que funciona melhor para seu aplicativo.Eu recomendo que você compare seu aplicativo usando conexões persistentes e não persistentes.

Maggie Nelson @ Objetivamente Orientado postei sobre isso em agosto e Robert Swartout fiz uma postagem de acompanhamento com alguns números concretos.Ambas são leituras muito boas.

Na minha humilde opinião:

Ao usar PHP para desenvolvimento web, a maior parte da sua conexão “viverá” apenas durante a execução da página.Uma conexão persistente vai custar muita sobrecarga, pois você terá que colocá-la na sessão ou algo parecido.

99% das vezes, uma única conexão não persistente que termina no final da execução da página funcionará perfeitamente.

Nos outros 1% das vezes, você provavelmente não deveria usar PHP para o aplicativo e não existe uma solução perfeita para você.

Eu ia fazer a mesma pergunta, mas em vez de fazer a mesma pergunta novamente, apenas adicionarei algumas informações que encontrei.

Também é importante notar que a extensão mysqli mais recente nem inclui a opção de usar conexões persistentes com o banco de dados.

Ainda estou usando conexões persistentes no momento, mas pretendo mudar para não persistentes em um futuro próximo.

Em geral, às vezes você precisará usar conexões não persistentes, e é bom ter um único padrão para aplicar ao design de conexão de banco de dados (desde que haja relativamente poucas vantagens em usar conexões persistentes em seu contexto).

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