Как вы контролируете тайм-ауты MySQL из SQLAlchemy?

StackOverflow https://stackoverflow.com/questions/1209640

  •  06-07-2019
  •  | 
  •  

Вопрос

Каков правильный способ контролировать тайм-ауты от клиента при работе с базой данных MySQL с использованием SQLAlchemy?Тот Самый connect_timeout Параметр URL кажется недостаточным.

Меня больше интересует, что происходит, когда компьютер, на котором запущена база данных, например, неожиданно исчезает из сети.Я не беспокоюсь о том, что сами запросы занимают слишком много времени.

Следующий скрипт выполняет то, что вы ожидаете (т. е. время ожидания истекает примерно через одну секунду), если какой - то хост недоступен до того, как тот самый while цикл когда-либо будет достигнут.Но если какой - то хост опускается во время тот самый while цикл (например, попробуйте выдернуть сетевой кабель после запуска цикла), тогда тайм-аут, похоже, займет не менее 18 секунд.Есть ли какая-то дополнительная настройка или параметр, которых мне не хватает?

Неудивительно, что wait_timeout переменная сеанса не работает, так как я думаю, что это переменная на стороне сервера.Но я бросил его туда просто на всякий случай.

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"
Это было полезно?

Решение

это невозможно из-за того, как работает TCP. если другой компьютер отключится от сети, он просто перестанет отвечать на входящие пакеты. "18 секунд" вы видите, что в вашем стеке TCP что-то не так из-за отсутствия ответа.

единственный способ получить желаемое поведение - заставить компьютер сгенерировать «я умираю»; сообщение непосредственно перед его смертью. что, если смерть неожиданна, совершенно невозможно.

ты когда-нибудь слышал о звуках ударов? это пакеты, которые системы высокой доступности отправляют друг другу каждую секунду или реже, чтобы другой знал, что они все еще существуют. если вы хотите, чтобы ваша заявка узнала "немедленно" что сервер ушел, сначала нужно решить, как долго " немедленный " (1 секунда, 200 мс и т. д.), а затем разработали систему (например, сердцебиение), чтобы определить, когда другой системы больше нет.

Другие советы

Может ли это быть ошибкой в соединителе mysql / python?https://bugs .launchpad.net/myconnpy/+bug/328998 в котором говорится, что тайм-аут жестко задан равным 10 секундам.

Чтобы действительно увидеть, где происходит сбой, вы могли бы использовать анализатор пакетов для проверки обмена данными между сервером и клиентом.wireshark + tcpdump отлично подходит для такого рода задач.

Я полагаю, что вы столкнулись с совершенно другой ошибкой, это страшная ошибка "mysql исчез", если я прав, решение состоит в обновлении до более нового драйвера mysqldb, поскольку ошибка была исправлена в драйвере.

Если по какой-то причине вы не можете / не будете обновляться, вам следует попробовать исправление SA для этого

db= create_engine('mysql://root@localhost/test', pool_recycle=True) 
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top