(2006,“MySQL 服务器已经消失”)WSGI django

发布于 2024-08-28 11:50:26 字数 231 浏览 5 评论 0原文

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

I have a MySQL gone away with Django under WSGI. I found entries for this problem on stackoverflow, but nothing with Django specifically. Google does not help, except for workarounds (like polling the website every once in a while, or increasing the database timeout). Nothing definitive. Technically, Django and/or MySQLdb (I'm using the latest 1.2.3c1) should attempt a reconnect if the server hanged the connection, but this does not happen. How can I solve this issue without workarounds ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

愿与i 2024-09-04 11:50:26

显示“wait_timeout”等变量;

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

show variables like 'wait_timeout';

this is the setting will throw back the "mysql gone away" error
set it to a very large value to prevent it "gone away"
or simple re-ping the mysql connection after certain period

远山浅 2024-09-04 11:50:26

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

  • 分辨率设置为不会修复

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

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

  • 推荐解决方案:使用 from django.db import 连接关闭连接; connection.close() 当您知道您的程序将闲置很长一段时间时。

  • 蹩脚的解决方案:增加 wait_timeout 使其长于程序的最大空闲时间。

在此上下文中,空闲时间是两次连续数据库查询之间的时间。

Django developers gave one short answer for all questions like this in https://code.djangoproject.com/ticket/21597#comment:29

  • Resolution set to wontfix

Actually this is the intended behavior after #15119. See that ticket for the rationale.

If you hit this problem and don't want to understand what's going on, don't reopen this ticket, just do this:

  • RECOMMENDED SOLUTION: close the connection with from django.db import connection; connection.close() when you know that your program is going to be idle for a long time.

  • CRAPPY SOLUTION: increase wait_timeout so it's longer than the maximum idle time of your program.

In this context, idle time is the time between two successive database queries.

不必在意 2024-09-04 11:50:26
  • 您可以创建中间件来 ping() MySQL 连接(其中
    在处理视图之前将重新连接(如果超时)

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

  • You could create middleware to ping() the MySQL connection (which
    will reconnect if it timed out) before processing the view

  • You could also add middleware to catch the exception, reconnect, and retry the
    view (I think I would prefer the above solution as simpler, but it should technically work and be performant assuming timeouts are rare. This also assumes a failed view has no side effects, which is a desirable property but can be difficult to do, especially if you write to a filesystem as well as a db in your view.)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文