De acuerdo, encontré una solución... Gracias a Will y PRR (mi compañero de trabajo).
no puedo comience un nuevo hilo en cada consulta, ya que esta es una aplicación en tiempo real, que se supone que procesa más de 1000 mensajes por segundo (de todos modos, gracias a R.. por la idea).
Además, no fue posible terminar la conexión a través de la biblioteca, ni cancelar/eliminar la consulta, ya que el problema estaba en el servidor DB.
Y aquí hay una solución de fuerza bruta, pero mucho mejor que _EXIT( FAILURE )
:Aquí está la pregunta relacionada:"Cómo forzar el cierre ¿zócalo en Linux?"
- Entonces, acabo de cerrar el socket usando una llamada al sistema.
NOTA importante :(gracias Will) - Resultó que nuestro envoltorio de la biblioteca MySQL tiene un indicador "a prueba de fallas", por lo que en un socket cerrado (u otro error crítico), intenta "resolver" el problema, por lo que vuelve a abrir el socket , por sí mismo, en mi caso. Por lo tanto, desactivé esta opción y todo está bien ahora:la ejecución finalizó debido a una excepción; esta es la forma "más suave" de hacerlo.
Esto debe hacerse a través de otro hilo, por supuesto:un temporizador, por ejemplo.
EDITAR: Los tiempos de espera realmente funcionan para las versiones posteriores a la 5.0.25. Pero, al menos en RHEL4 y RHEL5, los tiempos de espera se triplican por alguna razón. Por ejemplo, si algunos de los tiempos de espera se establecen en 20 segundos, el tiempo de espera real es de ~60 segundos.
Además, otra cosa importante es que estos tiempos de espera (como cualquier otra opción) DEBEN establecerse después mysql_init
y antes mysql_connect
o mysql_real_connect
.