Pergunta

Lembro -me de saber que o processo de conexão no MySQL foi projetado para ser muito rápido em comparação com outros rdbms e que, portanto, usando uma biblioteca que fornece pool de conexões (Sqlalchemy) não o ajudará muito se você ativar o pool de conexões.

Alguém tem alguma experiência com isto?

Estou desconfiado de habilitá -lo por causa da possibilidade de que, se algum código fizer algo com estado em uma conexão de banco de dados e (talvez por engano) não se limpe, o estado que normalmente seria limpo ao fechar a conexão, em vez disso, ficará Propagado ao código subsequente que obtém uma conexão reciclada.

Foi útil?

Solução

Não há necessidade de se preocupar com o estado residual em uma conexão ao usar o pool de conexão do SQLA, a menos que seu aplicativo esteja alterando as opções de conexão, como níveis de isolamento de transações (que geralmente não são o caso). O pool de conexão do SQLA emite um conexão.rollback () na conexão quando é verificado de volta, para que qualquer estado ou bloqueio transacional seja limpo.

É possível que o tempo de conexão do MySQL seja muito rápido, especialmente se você estiver conectando soquetes Unix na mesma máquina. Se você usar um pool de conexão, também deseja garantir que as conexões sejam recicladas após algum período de tempo, pois a biblioteca de clientes do MySQL desligará as conexões que estão ociosas por mais de 8 horas automaticamente (no sqlalchemy, esta é a opção Pool_recycle).

Você pode fazer rapidamente algum banco de pool de conexões vs. não com um aplicativo SQLA alterando a implementação do pool do padrão de Queuepool para Nullpool, que é uma implementação do pool que na verdade não agrupa nada - ele se conecta e se desconecta para real quando o A conexão proxiada é adquirida e posteriormente fechada.

Outras dicas

Mesmo que a parte da conexão do MySQL seja bastante lisa, presumivelmente ainda há uma conexão de rede envolvida (seja em loopback ou física). Se você está fazendo um muito de solicitações, isso pode ficar significativamente caro. Ele dependerá (como costuma ser o caso) exatamente do que seu aplicativo faz, é claro - se você estiver fazendo muito trabalho por conexão, isso dominará e você não ganhará muito.

Em caso de dúvida, Benchmark-mas eu confiaria em grande parte que uma biblioteca de pool de conexões (pelo menos, uma respeitável) deveria funcionar corretamente e redefinir as coisas adequadamente.

Resposta curta: Você precisa compará -lo.

Resposta longa: depende. O MySQL é rápido para a configuração de conexão, portanto, evitar esse custo não é um bom motivo para o pool de conexões. Onde você ganha, se as consultas são poucas e rápidas, porque você verá uma vitória com o pool.

A outra preocupação é como o aplicativo trata o thread SQL. Se não fizer transações SQL e não fizer suposições sobre o estado do encadeamento, o pool não será um problema. OTOH, código que depende do fechamento do encadeamento para descartar tabelas temporárias ou para transações de reversão terá muitos problemas com o agrupamento.

O pool de conexões acelera as coisas nesse fato de você não criar um objeto Java.SQL.Connection sempre que fizer uma consulta de banco de dados. Eu uso o pool de conexões Tomcat para um banco de dados MySQL para aplicativos da Web que fazem muitas consultas, durante a alta carga do usuário, há uma melhoria perceptível de velocidade.

Fiz um serviço repousante simples com o Django e testei -o com e sem pool de conexões. No meu caso, a diferença era bastante perceptível.

Em uma LAN, sem ela, o tempo de resposta foi entre 1 e 5 segundos. Com isso, menos de 20 ms. Os resultados podem variar, mas a configuração que estou usando para os servidores MySQL & Apache é bastante padrão.

Se você está servindo páginas de interface do usuário pela Internet, o tempo extra pode não ser perceptível para o usuário, mas no meu caso foi inaceitável, então optei por usar o pool. Espero que isso ajude você.

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