Cómo utilizar la función API de mysql c mysql
MYSQL_OPT_READ_TIMEOUT es un parámetro utilizado en el cliente MySQL c api para establecer el tiempo de espera de lectura. En la documentación oficial de MySQL, este parámetro se describe de la siguiente manera:
MYSQL_OPT_READ_TIMEOUT (Tipo de parámetro: unsigned int *) El tiempo de espera (en segundos) para cada intento de leer datos del servidor. Se realizan reintentos si es necesario, por lo que el valor total del tiempo de espera efectivo es tres veces el valor de la opción. Puede establecer este valor para que se detecte la pérdida de conexión antes de que el valor TCP/IPClose_Wait_Timeout sea de 10 minutos.
Esto significa que el valor de tiempo de espera real será 3 veces este valor cuando sea necesario. Sin embargo, las pruebas reales muestran que el tiempo de espera real es el mismo que el tiempo de espera establecido.
No hay registro de cuándo se produce un triple tiempo de espera. Por lo tanto, hicimos un análisis del código fuente de MySQL 5.7.20.
Utilice GDB para depurar el código y encontrar el código que realmente se comunica con el servidor mysql de la siguiente manera:
En la función vio_read(), recv y poll se utilizan para leer mensajes y realizar tiempos de espera de lectura. La función net_should_retry() devuelve verdadero solo cuando ocurre EINTR. El código es coherente con los resultados de la prueba y no vuelve a intentar leer tres veces. Los reintentos solo ocurrirán si la lectura es interrumpida por una interrupción del sistema, pero no hay límite para la cantidad de reintentos.
El análisis del código anterior muestra que la lógica del código no coincide con la descripción del documento. Entonces, después de buscar un poco, encontré un error de MySQL (error n.° 31163). El informe de error dice que en MySQL 5.0, el tiempo de espera real es de 1 hora. En 5.0, el tiempo de espera real para las lecturas de la API c de MySQL es tres veces el tiempo establecido, lo cual es consistente con la documentación existente. Por lo tanto, analizamos nuevamente el código de MySQL 5.0.96.
Utilice GDB nuevamente para encontrar el código de la parte de comunicación. Esta vez, encontré el código que se reintenta tres veces, de la siguiente manera:
Los tiempos de espera de lectura y escritura de esta versión de la API de MySQL se configuran directamente usando setsockopt. En el primer ciclo, el primer tiempo de espera ocurre en el punto A (la conexión del cliente siempre está en modo de bloqueo, aunque los comentarios dicen sin bloqueo). Luego configure el socket en modo de bloqueo en el punto B y reinicie los reintentos en el punto C. Dado que la alarma se activa por segunda vez, el bucle siguiente ingresará directamente a la rama en el punto D y determinará el número de bucles. Como cliente, net->retry_count siempre es 1, por lo que se reintenta dos veces, *** contando 3 bucles antes de salir de la función desde el punto E.
Se puede ver en el análisis anterior que este parámetro en el documento MySQL está obsoleto y el MYSQL_OPT_READ_TIMEOUT actual no causará tres problemas de tiempo de espera. El error #31163 también actualizó la documentación para indicar que el tiempo de espera de lectura real es tres veces el tiempo establecido. Quizás los mantenedores de MySQL se olvidaron de actualizar la documentación en versiones posteriores.