我有一个 Python 程序,它在后台运行数周,并且每隔一段时间进行一次数据库查询。为此,我使用的是 ORM peewee
(版本 2.2.1)。我MySQL
用作后端。
最近我在访问数据库时遇到了一个反复出现的问题,通常是在运行程序几天之后。引发的错误peewee
是
peewee.OperationalError: (2006, 'MySQL server has gone away')
追溯是深入的peewee
。我把它贴在这里,但由于我的virtualenv
文件名太长,我正在缩短它们:
File ".../local/lib/python2.7/site-packages/peewee.py", line 2910, in save
ret_pk = self.insert(**field_dict).execute()
File ".../local/lib/python2.7/site-packages/peewee.py", line 2068, in execute
return self.database.last_insert_id(self._execute(), self.model_class)
File ".../local/lib/python2.7/site-packages/peewee.py", line 1698, in _execute
return self.database.execute_sql(sql, params, self.require_commit)
File ".../local/lib/python2.7/site-packages/peewee.py", line 2232, in execute_sql
self.commit()
File ".../local/lib/python2.7/site-packages/peewee.py", line 2104, in __exit__
reraise(new_type, new_type(*exc_value.args), traceback)
File ".../local/lib/python2.7/site-packages/peewee.py", line 2223, in execute_sql
res = cursor.execute(sql, params or ())
File ".../local/lib/python2.7/site-packages/MySQLdb/cursors.py", line 205, in execute
self.errorhandler(self, exc, value)
File ".../local/lib/python2.7/site-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler
raise errorclass, errorvalue
peewee.OperationalError: (2006, 'MySQL server has gone away')
我发现的可能的解决方案尝试:
- 在这个问题
MySQL
中,其中一条评论建议每隔一段时间对服务器进行一次 ping操作以保持它(连接?)处于活动状态。不过,我不确定如何通过 ORM 做到这一点。(我应该只是SELECT 1
每小时一次吗?) - 在4 个月前打开的这个 github peewee issue中,提到了同样的错误,不过,据说那里已经解决了(我正在使用更新的版本)。
- 在一个7 年的问题中
trac
,一个建议是增加MySQL
3 天的超时时间。 - 在这个论坛讨论中,建议增加
MySQL
的超时选项,但提供了“使用 MySQL JDBC 连接器的 autoReconnect 选项”的替代方案。我试图弄清楚 Python 的MySQLdb
模块是否存在这样的选项,但找不到。 - 我找到了这个关于重新连接行为的MySQL 参考页面,但对于我的理解来说有点复杂
MySQL
(通常我只使用 ORM),而且我不知道如何从peewee
.
即使我能够 ping 数据库以使连接保持更长时间的活动,我认为在不需要连接时保持连接活动被认为是一种不好的做法。有没有办法通过 ORM 重新打开连接?我认为将 ping 和增加超时都MySQL
作为解决方法,而真正的解决方案是在需要时重新连接(真正的解决方案是我所要求的)。