Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django:如何阻止长查询杀死数据库?_Python_Mysql_Django_Timeout - Fatal编程技术网

Python Django:如何阻止长查询杀死数据库?

Python Django:如何阻止长查询杀死数据库?,python,mysql,django,timeout,Python,Mysql,Django,Timeout,我将Django 1.1与Mysql 5.*和MyISAM表一起使用 对于数据集中的异常值,我的一些查询可能需要花费大量时间。这些将锁定表并关闭站点。其他时候,似乎有些用户在请求完成之前就取消了请求,而有些查询将停留在“准备”阶段,锁定所有其他查询 我将尝试追踪所有角落的案例,但有一个安全网,这样网站就不会崩溃,这很好 我如何避免这种情况?我可以设置最大查询时间吗 似乎中止查询的唯一可靠方法是。一个不太激烈的措施是关闭连接(并重新打开一个新的连接);这将在查询尝试发送到客户端时立即终止查询。您知

我将Django 1.1与Mysql 5.*和MyISAM表一起使用

对于数据集中的异常值,我的一些查询可能需要花费大量时间。这些将锁定表并关闭站点。其他时候,似乎有些用户在请求完成之前就取消了请求,而有些查询将停留在“准备”阶段,锁定所有其他查询

我将尝试追踪所有角落的案例,但有一个安全网,这样网站就不会崩溃,这很好


我如何避免这种情况?我可以设置最大查询时间吗

似乎中止查询的唯一可靠方法是。一个不太激烈的措施是关闭连接(并重新打开一个新的连接);这将在查询尝试发送到客户端时立即终止查询。

您知道查询是什么吗?也许您可以优化SQL或在表中添加一些索引?

不幸的是,MySQL不允许您轻松地避免这种情况。一种常见的方法基本上是编写一个脚本,每X秒检查一次所有正在运行的进程(根据您认为的“长”),然后杀死它看到的运行时间过长的进程。不过,通过在MySQL中设置
log\u slow\u querys
,您至少可以获得一些基本诊断,这将把所有耗时超过10秒的查询写入日志。如果这对于您认为的“慢”来说太长,您可以将
long\u query\u time
设置为10以外的值来更改阈值

我正在使用Django DB复制应用程序,遇到了同样的困境,如果网络延迟增加,跨WAN的查询有时似乎会挂起

配方576780:任何(几乎)可调用的超时

创建任何可调用文件的时间限制版本

例如,要将函数
f
限制为t秒, 首先创建有时间限制的
f

from timelimited import *

f_t = TimeLimited(f, t)
然后,不要调用
f(…)
,而是像这样使用
f\u t

try:
    r = f_t(...)
except TimeLimitExpired:
    r = ...  # timed out
例如,使用以下方法:

def _run_timed_query(cursor, log_msg, timeout, query_string, *query_args):
    """Run a timed query, do error handling and logging"""
    import sys
    import traceback
    from timelimited import *

    try:
        return TimeLimited(cursor.execute, timeout)(query_string, *query_args)
    except TimeLimitExpired:
        logger_ec.error('%s; Timeout error.' % log_msg)
        raise TimeLimitExpired
    except:
        (exc_type, exc_info, tb) = sys.exc_info()
        logger_ec.error('%s; %s.' % (log_msg, traceback.format_exception(exc_type, exc_info, None)[0]))
        raise exc_type

使用InnoDB表,而不是。

您不应该编写这样的查询,至少不要在实时数据库上运行。Mysql有一个“慢速查询”参数,您可以使用它来识别导致您死亡的查询。大多数情况下,这些缓慢的查询要么有缺陷,要么可以通过定义一两个新索引来加快速度。

我如何在django中检测到这一点?我不希望有一个cronjob每秒钟检查一次,看看它能杀死什么…当然,我正在处理查询。我找到了4个杀死DB的。但是我想要一个安全网,这样就不会有任何查询可以锁定我的数据库并杀死网站。数据集中的异常值是什么?一个成就远远超过正常数量的人,或者在网络上有大量别名的人。唉,我很害怕这一点。您有没有为这项工作推荐任何脚本?您找到任何脚本来执行此操作吗?我找到了,但我大部分时间都在阅读,InnoDB对我的查询负载来说是一个数量级的减速:(