Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment définir un délai d'expiration pour la requête MySQL à l'aide de l'API C

D'accord, j'ai trouvé une solution. Merci à Will et PRR (mon collègue).

Je ne peux pas démarrer un nouveau fil sur chaque requête, car il s'agit d'une application en temps réel, censée traiter plus de 1000 messages par seconde. stackoverflow.com/users/379897/r">R.. pour l'idée).

De plus, il n'a pas été possible de mettre fin à la connexion via la bibliothèque, ni d'annuler/de tuer la requête, car le problème était dans le serveur de base de données..

Et voici une solution de force brute, mais toujours bien meilleure que _EXIT( FAILURE ) :Voici la question connexe :"Comment forcer la fermeture socket sous Linux ?" - donc, je viens de fermer le socket en utilisant un appel système.

REMARQUE importante :(merci Will) - Il s'est avéré que notre wrapper de bibliothèque MySQL a un indicateur "fail-safe", de sorte que sur un socket fermé (ou une autre erreur critique), il essaie de "résoudre" le problème, donc il rouvre le socket , par lui-même, dans mon cas. Donc, je viens de désactiver cette option et tout va bien maintenant - l'exécution est terminée à cause d'une exception - c'est la façon la plus "douce" de le faire.
Cela devrait être fait via un autre thread, bien sûr - un minuterie, par exemple.

MODIF : Les délais d'attente fonctionnent vraiment pour les versions après 5.0.25. Mais, au moins sur RHEL4 et RHEL5, les délais d'attente sont triplés pour une raison quelconque ! Par exemple, si certains des délais d'attente sont définis sur 20 secondes, le délai d'expiration réel est d'environ 60 secondes. être défini après mysql_init et avant mysql_connect ou mysql_real_connect .