我有一个 Python 程序,它在后台运行数周,并且每隔一段时间就会进行数据库查询。为此,我使用 ORMpeewee(版本 2.2.1)。我在用MySQL
作为后端。
最近,我在访问数据库时经常遇到问题,通常是在运行程序几天后。引发的错误peewee
is
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')
我发现的可能的解决方案尝试:
- In 这个问题,其中一条评论建议 ping
MySQL
服务器每隔一段时间就保持它(连接?)活动。不过,我不确定如何通过 ORM 来做到这一点。 (我应该简单地SELECT 1
每小时一次,是吗?)
- In 这个 github peewee 问题,这是 4 个月前打开的,虽然提到了同样的错误,但据称它已解决(并且我正在使用较新的版本)。
- In a 7年前的问题 of
trac
,一个建议是增加超时时间MySQL
3天。
- In this 论坛讨论,增加的选项
MySQL
建议设置超时,但提供了“使用 MySQL JDBC 连接器的 autoReconnect 选项”的替代方案。我试图弄清楚Python是否存在这样的选项MySQLdb
模块,但找不到。
- 我找到了这个MySQL 参考页面关于重新连接行为,但对于我的理解来说有点复杂
MySQL
(通常我只使用 ORM),并且我不知道如何应用其中的任何一个peewee
.
即使我能够 ping 数据库以使连接保持活动状态更长时间,我认为在不需要连接时保持连接活动状态被认为是一种不好的做法。有没有办法通过 ORM 重新打开连接?我考虑 ping 和增加超时MySQL
作为解决方法,而真正的解决方案是在需要时重新连接(真正的解决方案就是我所要求的)。