我使用Django 4.2连接到MySQL 8数据库。我正在使用asyncio来实现一个需要异步运行的函数:
example_object = asyncio.run(example(request))
async def example(request):
object = await ModelExample.objects.filter(example=example).afirst()
return object
我首先在await
行中出现错误:MySQL server has gone away
然后,通过手动关闭连接,如:
example_object = asyncio.run(example(request))
connection.close()
我开始出现以下错误:The client was disconnected by the server because of inactivity. See wait_timeout and interactive_timeout for configuring this behavior
这些错误不会立即发生,而是在我重新启动(nginx)服务器后的几个小时(可能是8小时,就像默认的wait_timeout变量一样)。
我尝试的其他事情:
- 在
asyncio.run
之前添加close_old_connections()
。不明白为什么有一个不活动的连接保持开放。 - 增加MySQL配置文件中的
wait_timeout
值和interactive_timeout
变量。我觉得很奇怪,这没有任何影响,但“SHOW VARIABLES”命令显示我,他们确实是目前设置为31536000。 - 然后我想也许Django的连接在某种程度上是独立的,并尝试将CONN_HEALTH_CHECKS选项设置为True,希望“如果健康检查失败,连接将重新建立而不会失败请求”
**更新:**我还尝试在Django设置文件中将CONN_MAX_AGE从默认的0更改为“None”,根据Django文档,这意味着无限的持久数据库连接。
我开始出现以下错误:Lost connection to MySQL server during query
你有别的主意吗?我越来越怀疑我没有得到一些核心的东西。
1条答案
按热度按时间sz81bmfz1#
在与OP进行了一些评论之后,解决方案是:
设置
CONN_MAX_AGE=0
;CONN_MAX_AGE
定义了连接的生命周期(以秒为单位),当这个参数设置为0
时,Django将为每个新请求创建一个新的连接,并在处理时关闭它(对于每个请求中的少数数据库调用很有用),但是使用CONN_MAX_AGE=None
时,它将为每个请求创建一个持久连接,直到Django重新启动才关闭它。