Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从SQLAlchemy控制MySQL超时?_Python_Mysql_Sqlalchemy - Fatal编程技术网

Python 如何从SQLAlchemy控制MySQL超时?

Python 如何从SQLAlchemy控制MySQL超时?,python,mysql,sqlalchemy,Python,Mysql,Sqlalchemy,使用SQLAlchemy在MySQL数据库上运行时,从客户端控制超时的正确方法是什么?connect\u timeoutURL参数似乎不足 我更感兴趣的是,当运行数据库的机器意外地从网络中消失时会发生什么。我不担心查询本身花费太长时间 如果某个主机在到达while循环之前不可用,则以下脚本将执行您预期的操作(即大约一秒钟后超时)。但是,如果某个主机在while循环期间停机(例如,在循环启动后尝试拔出其网络电缆),则超时时间似乎至少需要18秒。我是否缺少其他设置或参数 wait\u timeout

使用SQLAlchemy在MySQL数据库上运行时,从客户端控制超时的正确方法是什么?
connect\u timeout
URL参数似乎不足

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

如果某个主机在到达
while
循环之前不可用,则以下脚本将执行您预期的操作(即大约一秒钟后超时)。但是,如果某个主机在
while
循环期间停机(例如,在循环启动后尝试拔出其网络电缆),则超时时间似乎至少需要18秒。我是否缺少其他设置或参数

wait\u timeout
session变量不起作用并不奇怪,因为我认为这是一个服务器端变量。但我把它扔进去只是为了确定

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"

这可能是mysql/python连接器中的错误吗? 表示超时时间硬编码为10秒


要真正了解故障所在,可以使用数据包嗅探器检查服务器和客户端之间的对话。wireshark+tcpdump在这方面非常有效。

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

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

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

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

你能得到你想要的行为的唯一方法是让计算机在它死之前立即生成一条“我要死了”的信息。如果死亡是意外的,这是完全不可能的


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

听起来应该有一个与用于连接到db的套接字相关联的网络级超时…有,用于启动网络连接,但一旦建立连接,您所能做的似乎就更少了。这在一定程度上似乎是由于TCP的工作方式(例如,对故障或长时间的空闲通信等具有相当的容忍度)造成的。wait_timeout定义了在mysql服务器决定断开连接之前,客户端在命令之间有多长时间。“mysql已经离开了”当mysql服务器在TCP级别(即FIN)正常断开连接,但在应用程序级别异常断开连接时的结果。因此,这无助于检测服务器崩溃,因为崩溃的服务器不发送FINs。pool_recycle需要一个整数,表示在池中回收连接之前的秒数,而不是布尔值(可能是在2009年,不知道),这实际上是我想知道的事情之一;如果MySQL客户端和服务器之间的协议包含某种周期性心跳(例如,即使在长查询进行时,也会有周期性心跳)。不,没有。使用群集版本时,服务器之间有一个,但客户端和服务器之间没有。正在接受。。这基本上与我刚才在有效TCP中读到的内容一致: