【问题标题】:pymysql lost connection after a long periodpymysql在很长一段时间后失去连接
【发布时间】:2013-08-07 05:05:52
【问题描述】:

使用pymysql连接mysql,让程序长时间运行,例如晚上离开办公室,第二天早上回来。在此期间,对这个应用程序没有任何操作。现在做一个数据库提交会给出这个错误。

  File "/usr/local/lib/python3.3/site-packages/pymysql/cursors.py", line 117, in execute
    self.errorhandler(self, exc, value)
  File "/usr/local/lib/python3.3/site-packages/pymysql/connections.py", line 189, in defaulterrorhandler
    raise errorclass(errorvalue)

pymysql.err.OperationalError: (2013, 'Lost connection to MySQL server during query')

重启网络服务器(龙卷风),没问题。为什么长时间离开会出现这个错误?

【问题讨论】:

  • 也许你正在访问你的 mysql 服务器的wait_timeout
  • 好像是wait_timeout的问题,因为这个错误是在很长一段时间内才出现的,如何解决这个问题?我认为放大不是一个好选择。

标签: mysql python-3.x tornado pymysql


【解决方案1】:

wait_timeout 的存在是有原因的:长时间的空闲连接浪费了有限的服务器资源。你是对的:增加它不是正确的方法。

幸运的是,这是具有强大异常机制的 Python。我不熟悉pymysql,但大概你在某个地方有一个“open_connection”方法,它允许

try:
    cursor.do_something()
except pymysql.err.OperationalError as e:
    if e[0] == 2013: # Lost connection to server 
        # redo open_connection and do_something
    else:
        raise 

由于您没有发布任何调用代码,因此我无法构建此示例以匹配您的应用程序。关于except 子句有一些值得注意的地方:首先是它们应该总是尽可能的窄,在这种情况下(大概)有很多 OperationalErrors 并且你只知道如何处理“丢失的连接”。

如果它不是丢失连接异常,您应该重新引发它,以免它被吞没。除非您知道如何处理其他 OperationalErrors,否则这将向上传递并导致信息丰富的错误消息,这是合理的做法,因为届时您的光标可能已经无用了。

重新启动网络服务器只能修复丢失的连接,这是重新初始化所有内容的意外副作用;在代码中处理异常是实现目标的一种更为温和的方式。

【讨论】:

  • 连接接口有ping功能,可以用ping(reconnect=True)解决这个问题,谢谢你的解决方法是对的
猜你喜欢
  • 2012-03-07
  • 2011-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-15
  • 1970-01-01
  • 2019-12-02
相关资源
最近更新 更多