Django在CONN_MAX_AGE=60的情况下没有重用连接到MySQL。

6

我在开发中使用Django 1.9.2 (DEBUG=True) 并且使用MySQL 5.6.23。下面是我的数据库设置:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'dbname',
        'USER': "django",
        'PASSWORD': 'password',
        'HOST': 'localhost',
        'PORT': '3306',
        'CONN_MAX_AGE': 60,
    }
}

我正在使用以下命令查询MySQL以获取活动连接数:

show status where `variable_name` = 'Threads_connected';

它会产生如下结果。
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Threads_connected | 10    |
+-------------------+-------+
1 row in set (0,00 sec)

每次向Django发出新的请求时,连接的线程数都会增加,直到当连接数达到Threads_connected=151时,我会得到(1040,'Too many connections')错误。此外,60秒后连接仍未关闭。 这种行为在生产环境中似乎不会发生(DEBUG=False)。

这个问题解决了吗?我也遇到了这个问题。 - Wesley
你是如何启动Django的?Django是采用每个线程每个请求模型还是每个greenlet每个请求模型来处理请求的? - Jcyrss
1个回答

6
您正在开发模式下运行Django,因此CONN_MAX_AGE无效,因为每个请求都由不同的线程处理。从文档中可以看到:

开发服务器为每个请求创建一个新线程,使持久连接失效。不要在开发过程中启用它们。

关于连接在60秒后未关闭的问题:检查并在下一次请求开始时关闭超时连接,所以只需在60秒后进行新的django请求,它应该检测到过时的连接并将其关闭。

在每个请求的开始,如果Django连接已经到达最大寿命,它会关闭连接。 文档:https://docs.djangoproject.com/en/2.2/ref/databases/#connection-management - crazysj
1
@crazysj,已将您的链接添加到答案中,并稍微澄清了措辞。谢谢。 - sox with Monica

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接