相关疑难解决方法(0)

为什么我在 Django 中收到“MySQL 服务器已经消失”异常?

我正在使用 Django 2.2.6。

运行我的 django 项目的同一个系统也有一个后台服务在运行,它在 unix 套接字上监听请求。在 Django Admin 中,如果用户点击按钮,Django 会在 unix socket 上发送请求,后台服务会做一些事情。

我的后台服务可以完全访问 Django 的 ORM。它从我的项目的models.py 中导入模型,并且可以毫无问题地查询数据库。

问题是,如果我离开我的 django,我的后台服务在一夜之间运行,登录到 Django Admin,然后点击按钮,我的后台服务会抛出一个异常:

django.db.utils.OperationalError: (2006, 'MySQL server has gone away')
Run Code Online (Sandbox Code Playgroud)

看来这是因为 MySQL 数据库有一个超时期限,称为wait_timeout. 如果到数据库的连接长时间不活动,MySQL 将断开它。不幸的是,Django 没有注意到,并尝试使用它,抛出错误。

幸运的是,Django 为 settings.py 中定义的每个数据库都有自己的内置 CONN_MAX_AGE 变量。如果数据库连接比 CONN_MAX_AGE 旧,它会在请求之前关闭它并启动一个新的连接。

查看我的 MySQL 数据库:

> show session variables where variable_name = "wait_timeout";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wait_timeout  | 28800 |
+---------------+-------+
Run Code Online (Sandbox Code Playgroud)

查看我的 Django 的 CONN_MAX_AGE 变量:

# ./manage.py shell
>>> …
Run Code Online (Sandbox Code Playgroud)

python mysql django python-3.x

9
推荐指数
1
解决办法
2633
查看次数

标签 统计

django ×1

mysql ×1

python ×1

python-3.x ×1