2012-03-16 25 views
35

Con el fin de evitar la sobrecarga de establecer una nueva conexión cada vez que necesita un consulta disparados contra MySQL, hay dos opciones disponibles:MySQL - Conexión persistente frente a la agrupación de conexiones

  1. Las conexiones persistentes, por lo que una nueva conexión es solicitó que se realice un control para ver si ya hay una conexión "idéntica" abierta y, de ser así, úselo.
  2. agrupación de conexiones, mediante la cual el cliente mantiene un conjunto de conexiones, de modo que cada subproceso que necesite utilizar una conexión lo extraiga del grupo y lo devuelva al grupo cuando finalice.

Entonces, si tengo una aplicación de servidor multiproceso esperada para manejar miles de solicitudes por segundo, y cada subproceso tiene que desencadenar una consulta contra la base de datos, ¿cuál es la mejor opción?

Según entiendo, con las conexiones persistentes, todos los hilos en mi aplicación intentarán y usarán la misma conexión persistente a la base de datos porque todos están usando conexiones idénticas. Por lo tanto, se trata de una conexión compartida entre varios subprocesos de aplicaciones, por lo que las solicitudes se bloquearán pronto en el lado de la base de datos.

Si utilizo un mecanismo de agrupación de conexiones, tendré todos los subprocesos de aplicaciones compartiendo un conjunto de conexiones. Entonces hay menos posibilidades de una solicitud de bloqueo. Sin embargo, con la agrupación de conexiones, ¿debe esperar una aplicación para adquirir una conexión desde el grupo o debe enviar una solicitud sobre las conexiones en el grupo de todos modos en forma de turnos rotativos, y dejar que la cola, en su caso, suceda en la base de datos?

Respuesta

22

Tener conexiones persistentes no implica que todos los hilos usen la misma conexión. Simplemente "dice" que mantienes la conexión abierta (en contradicción para abrir una conexión cada vez que la necesites). Abrir una conexión es una operación costosa, por lo que, en general, intenta evitar la apertura de las conexiones más a menudo de lo necesario.

Esta es la razón por la cual las aplicaciones multiproceso a menudo usan pools de conexión. El grupo se encarga de abrir y cerrar las conexiones y cada subproceso que necesita una conexión solicita uno del grupo. Es importante tener cuidado de que el hilo devuelva la conexión lo antes posible al grupo, para que otro hilo pueda usarla.

Si su aplicación tiene solo unos pocos hilos largos que necesitan conexión, también puede abrir una conexión para cada hilo y mantenerla abierta.

El uso de una sola conexión (como la describió) es igual a un grupo de conexiones con el tamaño máximo uno. Esto tarde o temprano será su cuello de botella ya que todos los hilos tendrán que esperar la conexión. Esta podría ser una opción para serializar las operaciones de la base de datos (realizarlas en un orden determinado), aunque hay mejores opciones para garantizar la serialización.

+0

En caso de agrupamiento de conexiones, el desarrollador de la aplicación puede controlar cuándo y cuántas conexiones abrir/cerrar. Para MySQL, ¿cómo se puede controlar el número de conexiones persistentes "idénticas"? ¿Hay algún parámetro de configuración del servidor para el mismo? – user1259642

+2

En las piscinas que utilizo, establece el tamaño mínimo y máximo de la agrupación y define un tiempo de inactividad después del cual se cierra una conexión (más algunas otras cosas). – mrab

15

En relación con su pregunta acerca de si el servidor de aplicaciones espera una conexión, la respuesta es sí.

Las conexiones de MySQL están bloqueando. Cuando emite una solicitud del servidor MySQL a través de una conexión, la conexión esperará, inactiva, hasta que se reciba una respuesta del servidor.

No hay forma de enviar dos solicitudes en la misma conexión y ver qué devuelve primero. Solo puede enviar una solicitud a la vez.

Por lo tanto, generalmente, un único hilo en un conjunto de conexiones consta de una conexión del lado del cliente (en su caso, el servidor de aplicaciones es el cliente) y una conexión del servidor (base de datos).

Su aplicación debe esperar la existencia de un hilo de conexión disponible en el conjunto, lo que permite que el grupo crezca cuando sea necesario y reducir el número predeterminado de subprocesos cuando está menos ocupado.

Cuestiones relacionadas