2013-08-06 38 views
4

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

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') 

重新启动web服务器(龙卷风),没关系。为什么要留下它很长时间会得到这个错误?

+3

也许你正在击中你的mysql服务器的[wait_timeout](http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#sysvar_wait_timeout) – Gryphius

+0

可能的重复[在查询过程中丢失与MySQL服务器的连接(http://stackoverflow.com/questions/1884859/lost-connection-to-mysql-server-during-query) – msw

+0

似乎是一个wait_timeout问题,因为错误只出现在真的很长时间,如何解决这个问题?我不认为放大它是一个很好的选择。 – user2003548

回答

4

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,否则这将会被传递到堆栈,并产生一个信息错误信息,这是一个合理的事情,因为到那时你的光标可能无用。

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

+1

连接界面有ping功能,可以用ping(reconnect = True)来解决这个问题,谢谢你的解决方法是对的 – user2003548