Как правильно контролировать время ожидания с клиента при работе с базой данных MySQL с использованием SQLAlchemy? Параметр URL connect_timeout
кажется недостаточным.
Меня больше интересует, что происходит, когда машина, на которой работает база данных, например, неожиданно исчезает из сети. Я не беспокоюсь о том, что сами запросы занимают слишком много времени.
Следующий скрипт делает то, что вы ожидаете (то есть, время ожидания приблизительно через одну секунду), если somehost недоступен до того, как когда-либо будет достигнут цикл while
. Но если somehost выйдет из строя во время цикла 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"