¿Por qué es una mala práctica realizar varias conexiones a bases de datos en una sola solicitud?

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

Pregunta

Una discusión sobre Singletons en PHP Me hace pensar cada vez más en este tema.La mayoría de las personas indican que no se deben realizar un montón de conexiones de base de datos en una sola solicitud, y solo tengo curiosidad por saber cuál es su razonamiento.Mi primer pensamiento es el gasto que supone para su script realizar tantas solicitudes a la base de datos, pero luego me respondo con la pregunta:¿Múltiples conexiones no harían que las consultas simultáneas fueran más eficientes?

¿Qué tal algunas respuestas (con evidencia, amigos) de algunas personas que lo saben?

¿Fue útil?

Solución

Las conexiones a bases de datos son un recurso limitado.Algunas bases de datos tienen un límite de conexiones muy bajo y desperdiciar conexiones es un problema importante.Al consumir muchas conexiones, es posible que estés bloqueando a otros para que utilicen la base de datos.

Además, lanzar un montón de conexiones adicionales a la base de datos no ayuda en nada a menos que haya recursos en el servidor de la base de datos inactivos.Si tiene 8 núcleos y solo se utiliza uno para satisfacer una consulta, entonces, por supuesto, hacer otra conexión podría ser útil.Sin embargo, lo más probable es que ya esté utilizando todos los núcleos disponibles.También es probable que utilice el mismo disco duro para cada solicitud de base de datos y agregue contención de bloqueo adicional.

Si su base de datos tiene algo parecido a una alta utilización, agregar conexiones adicionales no ayudará.Eso sería como generar subprocesos adicionales en una aplicación con la ciega esperanza de que la concurrencia adicional acelere el procesamiento.Él podría en algunas circunstancias determinadas, pero en otros casos simplemente lo ralentizará a medida que golpea el disco duro, pierde tiempo cambiando de tareas e introduce una sobrecarga de sincronización.

Otros consejos

Es el costo de configurar la conexión, transferir los datos y luego desconectarla.Devorará tu rendimiento.

La evidencia es más difícil de conseguir, pero considere lo siguiente...

Digamos que se necesitan x microsegundos para establecer una conexión.

Ahora desea realizar varias solicitudes y obtener datos de un lado a otro.Digamos que la diferencia en el tiempo de transporte es insignificante entre una conexión y muchas (solo por el bien del argumento).

Ahora digamos que se necesitan y microsegundos para cerrar la conexión.

Abrir una conexión requerirá x+y microsegundos de sobrecarga.Abrir muchos tomará n * (x+y).Eso retrasará su ejecución.

Configurar una conexión DB suele ser bastante complicado.Muchas cosas están pasando detrás del escenario. (Resolución DNS/conexión TCP/Apretón de manos/Autenticación/Consulta real).

Una vez tuve un problema con una configuración de DNS extraña que hacía que cada conexión TCP tardara unos segundos antes de conectarse.Mi procedimiento de inicio de sesión (debido a una arquitectura compleja) requirió 3 conexiones de base de datos diferentes para completarse.Con ese problema, iniciar sesión estaba tardando una eternidad.Luego refactorizamos el código para que pasara por una sola conexión.

Accedemos a Informix desde .NET y utilizamos múltiples conexiones.A menos que estemos iniciando una transacción en cada conexión, a menudo se maneja en el grupo de conexiones.Sé que es muy específico de la marca, pero el acceso silencioso de la mayoría (?) de los sistemas de bases de datos agrupará las conexiones lo mejor que pueda.

Además, tuvimos un problema con el recuento de conexiones debido a las conexiones entre bases de datos.Informix admite sinónimos, por lo que asignamos sinónimos a los infractores comunes y las múltiples conexiones se manejaron en el lado del servidor, ahorrando mucho en tiempo de transferencia, gastos generales de creación de conexiones y (el verdadero quid de nuestra situación) tarifas de licencia.

Supongo que se debe a que sus solicitudes no se envían de forma asincrónica, ya que sus solicitudes se realizan de forma iterativa en el servidor, bloqueándose cada vez, debe pagar la sobrecarga de crear una conexión cada vez, cuando solo tiene que hacerlo. una vez...

En Flex, todas las llamadas a servicios web se realizan automáticamente de forma asincrónica, por lo que es común ver múltiples conexiones o solicitudes en cola en la misma conexión.

Las solicitudes asincrónicas mitigan el costo de conexión a través de un tiempo de solicitud/respuesta más rápido... porque no se puede fácilmente lograr esto en PHP sin algunos subprocesos, entonces el impacto en el rendimiento es mayor que simplemente reutilizar la misma conexión.

esos son mis 2 centavos...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top