2009-01-01 9 views
15

Recuerdo haber escuchado que el proceso de conexión en mysql fue diseñado para ser muy rápido en comparación con otros RDBMS, y que, por lo tanto, usar a library that provides connection pooling (SQLAlchemy) en realidad no lo ayudará mucho si habilita el grupo de conexiones.Pregunta de agrupamiento de conexiones Mysql: ¿vale la pena?

¿Alguien tiene alguna experiencia con esto?

Estoy receloso de habilitarlo debido a la posibilidad de que si algún código hace algo con estado en una conexión db y (quizás por error) no se limpia después de sí mismo, ese estado que normalmente se limpiaría al cerrar el En su lugar, la conexión se propagará al código subsiguiente que obtiene una conexión reciclada.

Respuesta

10

No hay necesidad de preocuparse por el estado residual de una conexión al utilizar el grupo de conexiones de SQLA, a menos que su aplicación cambie las opciones de toda la conexión, como los niveles de aislamiento de transacciones (que generalmente no es el caso). El grupo de conexiones de SQLA emite un connection.rollback() en la conexión cuando se vuelve a activar, de modo que se borre cualquier estado o bloqueos transaccionales.

Es posible que el tiempo de conexión de MySQL sea bastante rápido, especialmente si se está conectando a través de sockets Unix en la misma máquina. Si utiliza un grupo de conexiones, también debe asegurarse de que las conexiones se reciclen después de un período de tiempo ya que la biblioteca del cliente de MySQL cerrará automáticamente las conexiones que están inactivas durante más de 8 horas (en SQLAlchemy esta es la opción pool_recycle).

Puede rápidamente hacer algo de banqueta de conexión vs. no con una aplicación SQLA cambiando la implementación del grupo de la configuración predeterminada de QueuePool a NullPool, que es una implementación de grupo que no agrupa nada, se conecta y desconecta de verdad cuando se adquiere la conexión por proxy y luego se cierra.

6

Incluso si la parte de conexión de MySQL en sí misma es bastante resbaladiza, presumiblemente aún hay una conexión de red involucrada (ya sea en bucle o física). Si está haciendo un pedido de lote, eso podría ser significativamente costoso. Dependerá (como suele ser el caso) de exactamente lo que hace su aplicación, por supuesto, si está haciendo mucho trabajo por conexión, entonces eso dominará y no ganará mucho.

En caso de duda, punto de referencia, pero en general confiaría en que una biblioteca de agrupación de conexiones (al menos, una de buena reputación) debería funcionar correctamente y restablecer las cosas de manera adecuada.

+0

encontré otra pregunta/comentario en stackoverflow que indicaba que Apache Commons DB Connection Pooling es malo. – the0ther

0

El grupo de conexiones acelera las cosas en el hecho de que no tiene que crear un objeto java.sql.Connection cada vez que hace una consulta de base de datos. Utilizo el conjunto de conexiones Tomcat en una base de datos mysql para aplicaciones web que hacen muchas consultas, durante la alta carga de usuarios hay una notable mejora de velocidad.

+0

Esta pregunta es para Python, no para Java. –

+0

@ ZoranPavlovic en realidad la pregunta es para MySQL. Si se configura un grupo de conexiones, ¿"ayuda" a MySQL? Aunque el OP usó un cliente de grupo de conexiones de Python como ejemplo, no lo veo como el foco principal de la pregunta. – Mark

2

Respuesta corta: necesita establecer un punto de referencia.

Respuesta larga: depende. MySQL es rápido para la configuración de la conexión, por lo que evitar ese costo no es una buena razón para recurrir a la agrupación de conexiones. Donde ganas hay si las consultas se ejecutan son pocas y rápidas porque entonces verás una victoria con la puesta en común.

La otra preocupación es cómo trata la aplicación el subproceso SQL. Si no realiza transacciones SQL, y no hace suposiciones sobre el estado del hilo, entonces la agrupación no será un problema. OTOH, el código que se basa en el cierre del hilo para descartar tablas temporales o para deshacer transacciones tendrá muchos problemas con la agrupación.

0

Hice un servicio RESTful simple con Django y lo probé con y sin agrupamiento de conexiones.En mi caso, la diferencia fue bastante notoria.

En una LAN, sin ella, el tiempo de respuesta era de entre 1 y 5 segundos. Con eso, menos de 20 ms. Los resultados pueden variar, pero la configuración que estoy usando para los servidores Apache & de MySQL es bastante baja en términos estándar.

Si está publicando páginas de interfaz de usuario a través de Internet, es posible que el tiempo extra no sea notable para el usuario, pero en mi caso era inaceptable, por lo que opté por usar el grupo. Espero que esto te ayude.