Question

Quel est le bon moyen de contrôler les délais d'attente, à partir du client, lorsque vous utilisez une base de données MySQL, à l'aide de SQLAlchemy? Le paramètre d’URL connect_timeout semble insuffisant.

Je suis plus intéressé par ce qui se passe lorsque la machine sur laquelle la base de données s'exécute, par exemple, disparaît du réseau de manière inattendue. Je ne m'inquiète pas de la longueur des requêtes.

Le script suivant fait ce que vous attendez (c.-à-d. expiration du délai d'attente après environ une seconde) si un hôte n'est pas disponible avant le tant que la boucle est jamais atteinte. Mais si un hôte tombe en panne pendant la en boucle (par exemple, essayez de débrancher son câble de réseau après le début de la boucle), le délai semble écoulé. prendre au moins 18 secondes. Y a-t-il des réglages ou paramètres supplémentaires qui me manquent?

Il n'est pas surprenant que la variable de session wait_timeout ne fonctionne pas, car je pense que c'est une variable côté serveur. Mais je l’ai jeté là-bas pour en être sûr.

from sqlalchemy import *
from sqlalchemy.exc import *
import time
import sys

engine = create_engine("mysql://user:password@somehost/test?connect_timeout=1")
try:
    engine.execute("set session wait_timeout = 1;")
    while True:
        t = time.time()
        print t
        engine.execute("show tables;")
except DBAPIError:
    pass
finally:
    print time.time() - t, "seconds to time out"
Était-ce utile?

La solution

cela n’est pas possible en raison du fonctionnement de TCP. si l'autre ordinateur quitte le réseau, il cessera simplement de répondre aux paquets entrants. les "18 secondes" vous voyez que quelque chose sur votre pile TCP arrive à expiration faute de réponse.

Pour obtenir le comportement souhaité, l'ordinateur ne peut générer qu'un "je suis en train de mourir". message immédiatement avant sa mort. qui, si le décès est inattendu, est totalement impossible.

avez-vous déjà entendu parler de battements de coeur? Ce sont des paquets que les systèmes à haute disponibilité s’envoient toutes les secondes ou moins pour que l’autre sache qu’ils existent toujours. si vous souhaitez que votre application connaisse " immédiatement " que le serveur est parti, vous devez d’abord décider combien de temps "immédiat" (1 seconde, 200 ms, etc.) et a ensuite conçu un système (tel que des pulsations) pour détecter la perte de l’autre système.

Autres conseils

S'agit-il d'un bogue dans le connecteur mysql / python? https://bugs.launchpad.net/myconnpy/+bug/328998 qui dit que le délai d'attente est codé en dur à 10 secondes.

Pour vraiment savoir où se trouve la panne, vous pouvez utiliser un renifleur de paquets pour extraire la conversation entre le serveur et le client. wireshark + tcpdump fonctionne très bien pour ce genre de chose.

Je pense que vous êtes en train d’atteindre une erreur totalement différente, c’est un phénomène redouté "mysql a disparu". erreur, si je ne me trompe pas, la solution est de mettre à jour un pilote mysqldb plus récent car le bogue a été corrigé dans le pilote.

Si, pour une raison quelconque, vous ne pouvez pas / ne souhaitez pas effectuer de mise à jour, vous devez essayer le correctif SA pour cela

db= create_engine('mysql://root@localhost/test', pool_recycle=True) 
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top