Conexiones DB persistentes - ¿Sí o No?


Estoy usando la capa PDO de PHP para el acceso a datos en un proyecto, y he estado leyendo sobre ella y viendo que tiene un buen soporte innato para conexiones de base de datos persistentes. Me pregunto cuándo y si debería usarlas. ¿Vería beneficios de rendimiento en una aplicación pesada? ¿Hay inconvenientes a considerar, tal vez relacionados con la seguridad?

Si te importa, estoy usando MySQL 5.x.

Author: Brian Warshaw, 2008-09-08

7 answers

Podría usar esto como un "conjunto de reglas"aproximado:

, utilice conexiones persistentes, si:

  • Solo hay unas pocas aplicaciones/usuarios que acceden a la base de datos, es decir, no resultará en 200 conexiones abiertas (pero probablemente inactivas), porque hay 200 usuarios diferentes compartidos en el mismo host.
  • La base de datos se está ejecutando en otro servidor al que está accediendo a través de la red
  • Una (una) aplicación accede a la base de datos muy a menudo

NO , no utilice conexiones persistentes, si:

  • Su aplicación solo necesita acceder a la base de datos 100 veces por hora.
  • Tiene muchos servidores web que acceden a un servidor de base de datos
  • Estás usando Apache en modo prefork. Utiliza una conexión para cada proceso hijo, que puede aumentar bastante rápidamente. (vía @Powerlord en los comentarios)

El uso de conexiones persistentes es considerablemente más rápido, especialmente si está accediendo a base de datos a través de una red. No hace mucha diferencia si la base de datos se está ejecutando en la misma máquina, pero todavía es un poco más rápido. Sin embargo, como dice su nombre, la conexión es persistente, es decir, permanece abierta, incluso si no se usa.

El problema con eso es que en la "configuración predeterminada", MySQL solo permite 1000 "canales abiertos"paralelos. Después de eso, se rechazan nuevas conexiones (puede modificar esta configuración). Así que si usted tiene-por ejemplo-20 Servidores web con cada 100 Clientes en ellos, y cada uno de ellos tiene solo un acceso a la página por hora, simple math le mostrará que necesitará 2000 conexiones paralelas a la base de datos. Eso no funcionará.

Ergo: Úselo solo para aplicaciones con muchas solicitudes.

 59
Author: BlaM,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-01 11:53:00

En resumen, mi experiencia dice que las conexiones persistentes deben evitarse en la medida de lo posible.

Tenga en cuenta que mysql_close es un no-operation (no-op) para las conexiones que se crean utilizando mysql_pconnect. Esto significa que la conexión persistente no puede ser cerrada por el cliente a voluntad. Dicha conexión será cerrada por el servidor mysqldb cuando no se produzca ninguna actividad en la conexión durante más de wait_timeout. Si wait_timeout es un valor grande (digamos 30 min), entonces mysql db server puede alcanzar fácilmente el límite max_connections . En tal caso, mysql db no aceptará ninguna solicitud de conexión futura. Aquí es cuando su buscapersonas comienza a sonar.

Para evitar alcanzar el límite max_connections, el uso de la conexión persistente necesita un cuidadoso equilibrio de las siguientes variables...

1. Number of apache processes on one host
2. Total number of hosts running apache
3. wait_timout variable in mysql db server
4. max_connections variable in mysql db server
5. Number of requests served by one apache process before it is re-spawned

Por lo tanto, pl utilice la conexión persistente después de suficiente deliberación. Es posible que no desee invitar a problemas complejos de tiempo de ejecución para obtener una pequeña ganancia que obtiene de persistentes relación.

 9
Author: LionHeart,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-21 06:46:44

Crear conexiones a la base de datos es una operación bastante costosa. Las conexiones persistentes son una buena idea. En el ASP.Net y Java World, tenemos "connection pooling", que es más o menos lo mismo, y también una buena idea.

 4
Author: Josh Hinman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-08 18:03:15

IMO, La verdadera respuesta a esta pregunta es lo que funciona mejor para usted aplicación. Te recomendaría que compares tu aplicación usando conexiones persistentes y no persistentes.

Maggie Nelson @ Objetivamente Orientado publicó sobre esto en agosto y Robert Swarthout hizo un post adjunto con algunos números duros. Ambos son lecturas bastante buenas.

 3
Author: Mike H,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-08 18:16:39

En mi humilde opinión:

Cuando se utiliza PHP para el desarrollo web, la mayor parte de su conexión solo "vivirá" durante la vida de la página que se ejecuta. Una conexión persistente le va a costar una gran cantidad de gastos generales, ya que tendrá que ponerlo en la sesión o algo así.

El 99% de las veces una sola conexión no persistente que muere al final de la ejecución de la página funcionará bien.

El otro 1% del tiempo, probablemente no debería usar PHP para la aplicación, y allí no es una solución perfecta para ti.

 0
Author: Markus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-09 13:34:55

Iba a hacer esta misma pregunta, pero en lugar de hacer la misma pregunta de nuevo, solo agregaré algo de información que he encontrado.

También vale la pena señalar que la nueva extensión mysqli ni siquiera incluye la opción de usar conexiones persistentes a bases de datos.

Todavía estoy usando conexiones persistentes en este momento, pero planeo cambiar a no persistente en un futuro próximo.

 0
Author: ejunker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-11-10 19:06:22

En general, necesitará usar conexiones no persistentes a veces, y es bueno tener un solo patrón para aplicar al diseño de conexión de base de datos (siempre y cuando haya relativamente poca ventaja en el uso de conexiones persistentes en su contexto.)

 0
Author: dkretz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-11-10 19:09:27