我的 django 中不断出现 2006 错误(服务器消失),这是为什么?

There is a 2006 error( server gone away) continously in my django, why is it?

我的配置中没有设置变量CONN_MAX_AGE,据说默认为0,这意味着每个请求都会重新打开一个新的connection.But在我的程序中它不断显示错误(2006,服务器消失),因为每个查询 starts.I 都不知道为什么。

你并不孤单。自 1.6 以来,这一直是一个已知问题,我相信仍然存在。 (很高兴被纠正)。与问题相关的原始文档 from the Django Project.

大体上,我会重新配置您的问题,以便您定期打开一个新的数据库连接。我们有许多连接到 MySQL 的长 运行ning 进程,我们发现这是一个反复出现的问题。

你有三个选择。

稍微分解您的函数,以便每个块都可以建立自己的连接。这应该是您所描述的设置的隐式行为,但我也 运行 遇到了问题。

从 django 导入数据库

for thing in some_data:
    db.connections.close_all()
    your_stuff_here() 

连接的显式关闭(以及随后的重新打开)也比隐式行为更清晰,这也取决于您的 MySQL 超时配置方式。

一个非常 hacky 的解决方法是将您的内部函数包装在 try/except 中:

from django.db.utils import OperationalError
try: 
   stuff = Stuff.objects.get(id=123456)
except OperationalError:
   from django.db import connections
   c = connections['default'].cursor() 
   stuff = Stuff.objects.get(id=123456)

这绝对有效,因为游标连接在发生故障时会重新打开它。尽管我将其实施为对我们的一个漫长 运行ning 流程的修复,但它绝对是一个 hack。我不推荐它,我们随后将其重构为第一种方法。

最后,您可以提高 MySQL 超时时间,django 文档页面上将其列为不太理想的解决方案。

https://dev.mysql.com/doc/refman/5.6/en/auto-reconnect.html