Django Lost connection to MySQL server during query

实际的原因在于mysql 设置的timeout大于你的脚本执行时间,导致django的查询超时。

 登录mysql可以查看mysql wait_timeout:

SHOW GLOBAL VARIABLES;

 

django为了减少不必要的数据库连接、关闭,复用了数据库连接,当开始一个请求后建立一个连接池存放连接,之后此次请求都复用一个连接。那猜测就是django保存连接的比wait_timeout长了,如果保存时间短一些就可以重新建立连接避免此错误了。
没错,官方文档也已经说明了此问题,设置数据库 CONN_MAX_AGE参数,示例:

DATABASES = {
    "default": {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': '',
            'USER': '',
            'PASSWORD': '',
            'HOST': '',
            'CONN_MAX_AGE': 9  # 比wait_timeout小一些
    }
}

 

但是有的时候需要执行非常耗时的job,这种方式是行不通的。

解决方案:

再查询之前加入:

django.db.close_old_connections

 

posted @ 2020-08-27 14:42  sevck  阅读(130)  评论(0编辑  收藏