在我的Django中有一个2006年的错误(服务器消失了),为什么?
我没有在我的配置中设置变量CONN_MAX_AGE,据说它将默认为0,这意味着每个请求都会重新打开一个新的连接。但在我的程序中,它不断显示错误(2006年,服务器消失)因为每个查询开始。我不知道为什么。在我的Django中有一个2006年的错误(服务器消失了),为什么?
你并不孤单。这是自1.6以来已知的问题,我相信依然存在。 (很高兴能够纠正)。与该问题有关的原始文档from the Django Project.
大致上,我会重新配置您的问题,以便您定期打开新的数据库连接。我们有很多连接到MySQL的长时间运行的进程,并发现这是一个经常性问题。
您有三种选择。
稍微分开你的功能,以便块可以建立自己的连接。这应该是你所描述的设置的隐含行为,但我也遇到了问题。
从连接的Django的进口分贝
for thing in some_data:
db.connections.close_all()
your_stuff_here()
显式关闭(以及随后的重启)也比隐的行为,这也取决于你的MySQL超时是如何配置的清晰。
一个非常哈克解决方法是来包装你的内部函数在try /除外:
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)
这绝对有效,当光标连接重新打开它在发生故障的事件。虽然我将它作为我们长期运行的进程中的一个修复程序实施,但这绝对是一种破解。我不推荐它,我们随后将它重构为第一种方法。
最后,您可能会升高MySQL超时,这在django文档页面中提到的是一个不太理想的解决方案。
非常感谢,我认为CONN_MAX_AGE是无用的,我已将它设置为不同的值,但它仍然是我从mysql processlist中看到的相同连接。 –
CONN_MAX_AGE仅用于Django使用信号处理HTTP请求。所以如果您正在运行管理命令,则需要明确调用close_old_connections,以便检查需要关闭的时间。如我错了请纠正我。 –
您需要更具体些。这是通过视图加载页面吗?运行管理命令?例如,它是每个视图,还是仅仅是一些 - 你在上传大文件? – Withnail
我在命令模式下运行我的程序,并且我的程序将持续大约5小时,并持续向db发送查询。在我的程序结束时,它连续报告错误。但我的配置如上设置。我期待着你的回答。 @Withnail –