【问题标题】:(2006, 'MySQL server has gone away') in WSGI django(2006, 'MySQL server has gone away') 在 WSGI django
【发布时间】:2011-02-04 15:59:48
【问题描述】:

我有一个 MySQL 在 WSGI 下与 Django 一起消失。我在 stackoverflow 上找到了这个问题的条目,但没有专门针对 Django。谷歌没有帮助,除了变通方法(比如每隔一段时间轮询网站,或者增加数据库超时)。没有什么确定的。从技术上讲,如果服务器挂起连接,Django 和/或 MySQLdb(我使用的是最新的 1.2.3c1)应该尝试重新连接,但这不会发生。如何在没有变通方法的情况下解决此问题?

【问题讨论】:

  • Webserver 和 MySQL 在同一台机器上吗?如果不是,它们距离越近,网络问题导致服务器“消失”的可能性就越小。
  • 选择版本();显示进程列表;显示变量,如 '%max%;请粘贴输出:
  • 对于将来走这条路的任何人,以下是 MySQL 可能返回此错误的原因:dev.mysql.com/doc/refman/5.0/en/gone-away.html
  • 我们可以在问题行之前用单行重置连接,在另一个问题中查看我的回答:stackoverflow.com/a/67917637/2544762

标签: mysql django mysql-error-2006


【解决方案1】:

show variables like 'wait_timeout';

这是设置会抛出“mysql消失”错误
将其设置为一个非常大的值以防止它“消失”
或者在一段时间后简单地重新ping mysql连接

【讨论】:

  • 好吧,我现在换了工作,所以我无法测试它,但我希望它是正确的:)
【解决方案2】:

Django 开发人员在https://code.djangoproject.com/ticket/21597#comment:29 中为所有此类问题提供了一个简短的答案

  • 分辨率设置为 wontfix

实际上这是#15119 之后的预期行为。请参阅那张票以了解理由。

如果您遇到此问题并且不想了解发生了什么,请不要重新打开此工单,只需执行以下操作:

  • 建议的解决方案:当您知道您的程序将长时间空闲时,关闭与from django.db import connection; connection.close() 的连接。

  • 糟糕的解决方案:增加 wait_timeout 使其超过程序的最大空闲时间。

在这种情况下,空闲时间是两个连续数据库查询之间的时间。

【讨论】:

【解决方案3】:
  • 您可以创建中间件来 ping() MySQL 连接(其中 如果超时将重新连接)在处理视图之前

  • 您还可以添加中间件来捕获异常、重新连接并重试 视图(我想我更喜欢上面的解决方案更简单,但它应该在技术上工作并且假设超时很少见。这也假设失败的视图没有副作用,这是一个理想的属性,但很难做到,特别是如果您在视图中写入文件系统和数据库。)

【讨论】:

    猜你喜欢
    • 2011-12-11
    • 2012-12-19
    • 2013-12-16
    • 2015-10-20
    • 2012-10-30
    • 2019-10-13
    • 2015-12-02
    • 2017-12-21
    • 2020-07-19
    相关资源
    最近更新 更多