如果 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 的剩余年龄更短,会发生啥情况?的主要内容,如果未能解决你的问题,请参考以下文章

SELECT * 真的比只选择需要的列花费更多的时间吗?

SQL Server 探查器

查询在数据库中花费了更多时间,尽管在连接条件中使用了索引列,那么我们可以在代码中做些啥来优化

sql查询需要时间,因为我正在查看三个表

为啥 dask 的“to_sql”比 pandas 花费更多时间?

Mysql 性能:哪个查询会花费更多时间?