如何从SQLAlchemy控制MySQL超时?

时间:2009-07-30 21:59:19

标签: python mysql sqlalchemy

使用SQLAlchemy在客户端运行MySQL数据库时,控制超时的正确方法是什么? 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"

3 个答案:

答案 0 :(得分:5)

由于TCP的工作方式,这是不可能的。如果另一台计算机从网络中掉线,它将只是停止响应传入的数据包。你看到的“18秒”是由于没有响应而导致你的TCP堆栈超时。

你可以获得所需行为的唯一方法就是让计算机在它死之前立即生成“我正在死亡”的消息。如果死亡意外,那是完全不可能的。

你有没有听说过听觉声音?这些是高可用性系统每隔一秒或更短时间发送给另一个的数据包,让另一个知道它们仍然存在。如果您希望您的应用程序“立即”知道服务器已经消失,您首先必须决定“立即”多长时间(1秒,200毫秒等),然后设计一个系统(如心跳)来检测何时另一个系统不再存在。

答案 1 :(得分:1)

这可能是mysql / python连接器中的错误吗? https://bugs.launchpad.net/myconnpy/+bug/328998 这表示超时被硬编码为10秒。

要真正了解故障的位置,您可以使用数据包嗅探器来检查服务器和客户端之间的对话。 wireshark + tcpdump非常适合这种事情。

答案 2 :(得分:1)

我相信你正在达成一个完全不同的错误,这是一个可怕的“mysql已经消失”错误,如果我是正确的解决方案是更新到更新的mysqldb驱动程序,因为错误已经在驱动程序中的补丁。

如果由于某种原因你不能/不会更新你应该尝试SA修复此

db= create_engine('mysql://root@localhost/test', pool_recycle=True)