【问题标题】:How do you control MySQL timeouts from SQLAlchemy?你如何从 SQLAlchemy 控制 MySQL 超时?
【发布时间】:2010-11-15 15:06:12
【问题描述】:

在使用 SQLAlchemy 对 MySQL 数据库运行时,从客户端控制超时的正确方法是什么? connect_timeout URL 参数似乎不够用。

我更感兴趣的是当运行数据库的机器(例如,意外从网络中消失)时会发生什么。我不担心查询本身花费太长时间。

如果 somehost 不可用 到达 while 循环之前,以下脚本会执行您所期望的操作(即,大约一秒后超时)。但是如果 somehostwhile 循环中 期间出现故障(例如,尝试在循环开始后拔出其网络电缆),那么超时似乎至少需要 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 应该如何工作(例如,相当容忍故障或长时间的空闲通信等)
  • wait_timeout 定义了在 mysql 服务器决定断开连接之前客户端在命令之间有多长时间。

标签: python mysql sqlalchemy


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    如果由于某种原因您无法/不会更新,您应该为此尝试 SA 修复

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

    【讨论】:

    • "mysql has gone away" mysql 服务器在 TCP 级别(即 FIN)正常断开连接但在应用程序级别异常断开时的结果。因此这将无助于检测服务器崩溃,因为崩溃的服务器不发送任何 FIN。
    • pool_recycle 需要一个整数,表示在池中回收连接之前的秒数,而不是布尔值(可能是在 2009 年,不知道)
    【解决方案3】:

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

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

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

    【讨论】:

    • 这实际上是我想知道的事情之一;如果 MySQL 客户端和服务器之间的协议包含某种周期性心跳(例如,即使在进行长时间查询时也会有周期性心跳)。
    • 不,没有。使用集群版本时,服务器之间有一个,但客户端和服务器之间没有。
    • Accepting.. 这基本上与我刚刚在有效 TCP 中读到的内容相吻合:home.netcom.com/~jsnader/etcptoc.html
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-12
    • 1970-01-01
    • 2014-05-18
    • 2019-12-28
    • 1970-01-01
    • 2011-03-22
    • 2013-01-08
    相关资源
    最近更新 更多