我有一个 MySQL 在 WSGI 下随 Django 一起消失了。我在 stackoverflow 上找到了这个问题的条目,但没有专门针对 Django。谷歌没有帮助,除了变通方法(比如每隔一段时间轮询网站,或者增加数据库超时)。没有什么确定的。从技术上讲,如果服务器挂起连接,Django 和/或 MySQLdb(我使用的是最新的 1.2.3c1)应该尝试重新连接,但这不会发生。如何在没有变通方法的情况下解决此问题?
3 回答
show variables like 'wait_timeout';
这是设置将抛出“mysql消失”错误
将其设置为一个非常大的值以防止它“消失”
或在一段时间后简单地重新ping mysql连接
Django 开发人员在https://code.djangoproject.com/ticket/21597#comment:29中为所有此类问题提供了一个简短的答案
- 分辨率设置为wontfix
实际上这是#15119 之后的预期行为。看那张票的理由。
如果您遇到此问题并且不想了解发生了什么,请不要重新打开此工单,只需执行以下操作:
from django.db import connection; connection.close()
推荐解决方案:当您知道您的程序将长时间空闲时关闭连接。糟糕的解决方案:增加 wait_timeout 使其超过程序的最大空闲时间。
在这种情况下,空闲时间是两个连续数据库查询之间的时间。
您可以在处理视图之前创建中间件来 ping() MySQL 连接(如果超时,它将重新连接)
您还可以添加中间件来捕获异常,重新连接并重试视图(我认为我更喜欢上述解决方案更简单,但它应该在技术上有效并且假设超时很少见。这也假设失败的视图没有边效果,这是一个理想的属性,但可能很难做到,尤其是当您写入文件系统以及视图中的数据库时。)