2017-06-26 18 views
0

我没有在我的配置中设置变量CONN_MAX_AGE,据说它将默认为0,这意味着每个请求都会重新打开一个新的连接。但在我的程序中,它不断显示错误(2006年,服务器消失)因为每个查询开始。我​​不知道为什么。在我的Django中有一个2006年的错误(服务器消失了),为什么?

+0

您需要更具体些。这是通过视图加载页面吗?运行管理命令?例如,它是每个视图,还是仅仅是一些 - 你在上传大文件? – Withnail

+0

我在命令模式下运行我的程序,并且我的程序将持续大约5小时,并持续向db发送查询。在我的程序结束时,它连续报告错误。但我的配置如上设置。我期待着你的回答。 @Withnail –

回答

0

你并不孤单。这是自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文档页面中提到的是一个不太理想的解决方案。

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

+0

非常感谢,我认为CONN_MAX_AGE是无用的,我已将它设置为不同的值,但它仍然是我从mysql processlist中看到的相同连接。 –

+0

CONN_MAX_AGE仅用于Django使用信号处理HTTP请求。所以如果您正在运行管理命令,则需要明确调用close_old_connections,以便检查需要关闭的时间。如我错了请纠正我。 –

相关问题