概述
我有一个Python程序,它在后台运行数周,每隔一段时间就进行一次数据库查询。为此,我使用ORM^{}(版本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')
我发现的可能的解决方案尝试:在this question中,其中一条评论建议每隔一段时间ping一次MySQL服务器以保持它(连接?)活着。不过,我不知道如何通过ORM来实现。(我应该简单地说,每小时SELECT 1?)
在4个月前打开的this github peewee issue中,也出现了同样的错误,不过,据说已经解决了(我正在使用一个更新的版本)。
在trac的7 year old issue中,一个建议是将MySQL的超时时间增加3天。
在这个forum discussion中,建议增加MySQL的超时,但是提供了“对MySQL JDBC连接器使用autoReconnect选项”的替代方案。我试图找出Python的MySQLdb模块是否存在这样的选项,但找不到。
我已经在重连行为上发现了这个MySQL reference page,但是对于我对MySQL(通常我只使用ORMs)的理解来说,它有点复杂,而且我不知道如何从peewee中应用它。
即使我能够ping数据库以使连接保持长时间的活动,我认为在不需要连接的情况下保持连接活动被认为是一种不好的做法。有没有办法通过ORM重新打开连接?我认为ping和增加MySQL的超时都是解决方法,而真正的解决方案是在需要时重新连接(而真正的解决方案正是我所要求的)。
最后
以上就是迅速山水为你收集整理的python mysql重新连接_在timeou上重新连接MySQL的全部内容,希望文章能够帮你解决python mysql重新连接_在timeou上重新连接MySQL所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复