如果 SQL 查询花费更多时间并且 CONN_MAX_AGE 的剩余年龄更短,会发生啥情况?
Posted
技术标签:
【中文标题】如果 SQL 查询花费更多时间并且 CONN_MAX_AGE 的剩余年龄更短,会发生啥情况?【英文标题】:What happens If an SQL query takes more time and the left age of CONN_MAX_AGE is less?如果 SQL 查询花费更多时间并且 CONN_MAX_AGE 的剩余年龄更短,会发生什么情况? 【发布时间】:2021-01-16 21:14:02 【问题描述】:使用:
Django 1.10 和 mysql当特定查询需要较长时间时,我想使查询超时。我发现的最接近的一件事就是这个。 https://docs.djangoproject.com/en/1.10/ref/settings/#conn-max-age
CONN_MAX_AGE
数据库连接的生命周期,以秒为单位。使用 0 在每个请求结束时关闭数据库连接(Django 的历史行为),使用 None 表示无限的持久连接。
让我们假设以下场景:
CONN_MAX_AGE
设置为 5 秒
平均而言,每个数据库查询需要 3 秒。
-
请求 #1 进来,由于没有活动连接,它创建一个连接并将连接时间设置为 5 秒。
请求 #1 在 3 秒后完成,并且 conn 的剩余期限为 2 秒。
现在,请求 #2 进来了,由于 conn 可用,它使用旧的 open conn。
现在,请求 #2 会发生什么?它会成功完成,还是会因为这个查询使用的 conn 过期时间较短而终止?
【问题讨论】:
【参考方案1】:不,CONN_MAX_AGE
仅在请求完成后启动。它用于汇集现有连接,而不是不断关闭和打开新连接。
您正在寻找的是 MySQL 的 max_execution_time
设置:
DATABASES =
'default':
'ENGINE': 'django.db.backends.mysql',
...
'OPTIONS':
'init_command': 'SET max_execution_time=5000'
这会将每个语句限制为最多 5 秒。
【讨论】:
以上是关于如果 SQL 查询花费更多时间并且 CONN_MAX_AGE 的剩余年龄更短,会发生啥情况?的主要内容,如果未能解决你的问题,请参考以下文章
查询在数据库中花费了更多时间,尽管在连接条件中使用了索引列,那么我们可以在代码中做些啥来优化