当前位置: 首页 > 面试题库 >

超时时重新连接MySQL

詹夕
2023-03-14
问题内容

我有一个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问题中,引用了相同的错误,但是据称在那里已经解决了(我正在使用较新的版本)。
  • 在的7年发行中trac,一个建议是增加MySQL3天的超时。
  • 在该论坛讨论中,MySQL建议了增加超时的选项,但是提供了“对MySQL JDBC连接器使用autoReconnect选项”的替代方法。我试图弄清楚PythonMySQLdb模块是否存在这样的选项,但是找不到。
  • 我已经找到了有关重新连接行为的MySQL参考页,但是对于我的理解MySQL(通常我只使用ORM)来说有点复杂,并且我不知道如何从中应用其中的任何内容peewee

即使我能够对数据库执行ping操作以使连接保持更长的时间,但我认为在不需要连接的情况下保持连接的活动仍然是一种不好的做法。有什么办法可以通过ORM重新打开连接吗?我认为ping和增加超时都是MySQL一种解决方法,而真正的解决方案是在需要时重新连接(而真正的解决方案是我要的)。


问题答案:

你必须捕获异常,并在此基础上的错误,重新连接或到别的做一些事情。无论是连接超时,或者网络问题或MySQL的必须重新启动。

下面(pseudoish)代码展示了如何能做到这一点,但有更多的东西。你会想尝试了几次,然后保释出来,或者也许尝试每隔2分钟左右。

while True:
    try:
        # do your database stuff
    except peewee.OperationalError as exc:
        # Oops! We have to try to reconnect

是否使用ORM并不重要。但是,ORM可能提供此功能。



 类似资料:
  • 我的Spring Hibernate Web应用程序在MySQL上运行,这给我带来了麻烦。 我四处寻找并尝试了不同的配置,在这个网站上阅读了相当多的帖子,但它仍然会弹出微笑的头像。 错误消息是:由:com.mysql.jdbc.exceptions.jdbc4.通信异常:从服务器成功接收到的最后一个数据包是63,313,144毫秒前。最后一个成功发送到服务器的数据包是63,313,144毫秒前。比

  • 我刚刚升级到Android Studio 2.2.1版本,并且一个项目运行良好,现在我得到以下错误消息: 我知道还有另一个问题与此类似,但不是相同的情况。我不使用任何代理什么的。

  • 在我的composer.json我更新了以下行: 当我调用

  • 我正在使用带有PostgreSQL数据库服务器的桌面应用程序。当我连续10到20分钟不使用应用程序时,数据库连接会断开。我正在使用PostgresqlJDBC进行数据库连接。 请帮我在这个数据库连接超时。 谢谢

  • 我正在使用Java套接字创建加密通信终端。我的问题是,当我通过“localhost”或我的计算机局域网地址连接时,程序连接完美,并按预期工作,但当我使用我的公共IP地址连接时,连接被拒绝,我得到 java.net.连接异常:连接超时:连接java.base/java.net.DualStackPlainSocketImpl.connect0(本地方法)在java.base/java.net.Dua

  • 我在vm上运行rabbitMQ服务器。我正在学习rabbitMQ java教程。它在vm上本地运行良好,但当尝试从主机发送时,我遇到了一个异常 以下是我正在使用的发送代码: 我可以ping服务器在192.168.198.100但我不能访问管理UI在192.168.198.100:15672/ 有人能帮我弄清楚这个问题出了什么问题吗?提前感谢。

  • 在将AndroidStudio 2.3升级到3.0之后,我犯了很多错误,做了很多工作,但都没有成功 错误:无法解析配置“:app:debugCompileClasspath”的所有文件。 无法解析com。Android支持:appcompat-v7:26.1.0。必需:项目:应用无法解析com。Android支持:appcompat-v7:26.1.0。无法分析POMhttps://dl.goog