【发布时间】:2010-11-15 15:06:12
【问题描述】:
在使用 SQLAlchemy 对 MySQL 数据库运行时,从客户端控制超时的正确方法是什么? connect_timeout URL 参数似乎不够用。
我更感兴趣的是当运行数据库的机器(例如,意外从网络中消失)时会发生什么。我不担心查询本身花费太长时间。
如果 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"
【问题讨论】:
-
听起来应该有一个与用于连接数据库的套接字相关联的网络级超时......
-
有,用于启动网络连接,但一旦建立连接,它会显得你可以做的更少。这似乎部分是由于 TCP 应该如何工作(例如,相当容忍故障或长时间的空闲通信等)
-
wait_timeout 定义了在 mysql 服务器决定断开连接之前客户端在命令之间有多长时间。
标签: python mysql sqlalchemy