“客户端由于不活动而被服务器断开连接”使用Django中的异步函数

tvokkenx  于 2023-06-07  发布在  Go
关注(0)|答案(1)|浏览(304)

我使用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
你有别的主意吗?我越来越怀疑我没有得到一些核心的东西。

sz81bmfz

sz81bmfz1#

在与OP进行了一些评论之后,解决方案是:
设置CONN_MAX_AGE=0; CONN_MAX_AGE定义了连接的生命周期(以秒为单位),当这个参数设置为0时,Django将为每个新请求创建一个新的连接,并在处理时关闭它(对于每个请求中的少数数据库调用很有用),但是使用CONN_MAX_AGE=None时,它将为每个请求创建一个持久连接,直到Django重新启动才关闭它。

相关问题